带有空列的Oracle连接表

发布于 2025-01-23 15:20:34 字数 3172 浏览 1 评论 0原文

我想加入4个表,例如在下面的代码中。其中IIN是主要钥匙。但是,如果一张表中存在IIN DOENST,则我的代码的结果将为null。

SELECT 
  COALESCE(D.TERRORIST, 0) as TERRORIST,
  COALESCE(D.SPECIAL,0) as SPECIAL,
  COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
  COALESCE(B.ANOTHER, 0) as OSB,
  COALESCE(B.LSBOO,0) as LSBOO,
  COALESCE(R.DELAY,0) as DELAY
FROM RBPM.LIST_CL_DWHFM D
    JOIN RBPM.LIST_CL_TAXPAYER T
      ON D.IIN = T.IIN
    JOIN RBPM.LIST_CL_BLACK B
      ON T.IIN = B.IIN
    JOIN RBPM.LIST_CL_RBO R
      ON B.IIN = R.IIN
WHERE 1=1
AND D.IIN = '123456789123'

For example:

Table RBPM.LIST_CL_DWHFM

IINTERRORISTSPECIAL
nullnullnull

Table RBPM.LIST_CL_TAXPAYER

IINTAXPAYER
'123456789123'0

Table RBPM.LIST_CL_BLACK

IINOSBLSBOO
'123456789123'01

Table RBPM.LIST_CL_RBO

IINDELAY
'123456789123'0

Expecting:

TERRORISTSPECIALTAXPAYEROSBLSBOO延迟
nullNull0010

结果:

恐怖特殊纳税人OSBLSBOO延迟
nullnullnullnullnullnull null null null null null null null

I want to join 4 tables, like in a code below. Where IIN is primary key. But if IIN doenst exist in one table, my code's result will be null.

SELECT 
  COALESCE(D.TERRORIST, 0) as TERRORIST,
  COALESCE(D.SPECIAL,0) as SPECIAL,
  COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
  COALESCE(B.ANOTHER, 0) as OSB,
  COALESCE(B.LSBOO,0) as LSBOO,
  COALESCE(R.DELAY,0) as DELAY
FROM RBPM.LIST_CL_DWHFM D
    JOIN RBPM.LIST_CL_TAXPAYER T
      ON D.IIN = T.IIN
    JOIN RBPM.LIST_CL_BLACK B
      ON T.IIN = B.IIN
    JOIN RBPM.LIST_CL_RBO R
      ON B.IIN = R.IIN
WHERE 1=1
AND D.IIN = '123456789123'

For example:

Table RBPM.LIST_CL_DWHFM

IINTERRORISTSPECIAL
nullnullnull

Table RBPM.LIST_CL_TAXPAYER

IINTAXPAYER
'123456789123'0

Table RBPM.LIST_CL_BLACK

IINOSBLSBOO
'123456789123'01

Table RBPM.LIST_CL_RBO

IINDELAY
'123456789123'0

Expecting:

TERRORISTSPECIALTAXPAYEROSBLSBOODELAY
nullnull0010

Result:

TERRORISTSPECIALTAXPAYEROSBLSBOODELAY
nullnullnullnullnullnull

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

明天过后 2025-01-30 15:20:34

如果任何表格可能的空IIN iin,您可以构建所有IIN的列表并将其加入到它上(尽管最好至少拥有一个具有所有IIN的表):

SELECT 
 COALESCE(D.TERRORIST, 0) as TERRORIST,
 COALESCE(D.SPECIAL,0) as SPECIAL,
 COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
 COALESCE(B.ANOTHER, 0) as OSB,
 COALESCE(B.LSBOO,0) as LSBOO,
 COALESCE(R.DELAY,0) as DELAY
FROM 
 (
  SELECT IIN FROM RBPM.LIST_CL_DWHFM
  UNION
  SELECT IIN FROM RBPM.LIST_CL_TAXPAYER
  UNION
  SELECT IIN FROM RBPM.LIST_CL_BLACK
  UNION
  SELECT IIN FROM RBPM.LIST_CL_RBO
 ) a
 LEFT JOIN RBPM.LIST_CL_DWHFM D ON a.IIN = D.IIN
 LEFT JOIN RBPM.LIST_CL_TAXPAYER T ON a.IIN = T.IIN
 LEFT JOIN RBPM.LIST_CL_BLACK B ON a.IIN = B.IIN
 LEFT JOIN RBPM.LIST_CL_RBO R ON a.IIN = R.IIN
WHERE 1=1
AND a.IIN = '123456789123'

您也可以完全加入所有内容,将凝聚/多层次或在哪里放置。我将其中的1 = 1留在一个假设上,即您在编程中串联了其他子句。 请将其删除,您可以:

如果您只想查询一个IIN,

SELECT 
 COALESCE(D.TERRORIST, 0) as TERRORIST,
 COALESCE(D.SPECIAL,0) as SPECIAL,
 COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
 COALESCE(B.ANOTHER, 0) as OSB,
 COALESCE(B.LSBOO,0) as LSBOO,
 COALESCE(R.DELAY,0) as DELAY
FROM 
 (
  SELECT '123456789123' AS IIN FROM DUAL
 ) x
 LEFT JOIN RBPM.LIST_CL_DWHFM D ON x.IIN = D.IIN
 LEFT JOIN RBPM.LIST_CL_TAXPAYER T ON x.IIN = T.IIN
 LEFT JOIN RBPM.LIST_CL_BLACK B ON x.IIN = B.IIN
 LEFT JOIN RBPM.LIST_CL_RBO R ON x.IIN = R.IIN

If any table might have a null IIN you can build a list of all the IINs and left join onto it, (though it would be better to have at least one table that has all the IINs):

SELECT 
 COALESCE(D.TERRORIST, 0) as TERRORIST,
 COALESCE(D.SPECIAL,0) as SPECIAL,
 COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
 COALESCE(B.ANOTHER, 0) as OSB,
 COALESCE(B.LSBOO,0) as LSBOO,
 COALESCE(R.DELAY,0) as DELAY
FROM 
 (
  SELECT IIN FROM RBPM.LIST_CL_DWHFM
  UNION
  SELECT IIN FROM RBPM.LIST_CL_TAXPAYER
  UNION
  SELECT IIN FROM RBPM.LIST_CL_BLACK
  UNION
  SELECT IIN FROM RBPM.LIST_CL_RBO
 ) a
 LEFT JOIN RBPM.LIST_CL_DWHFM D ON a.IIN = D.IIN
 LEFT JOIN RBPM.LIST_CL_TAXPAYER T ON a.IIN = T.IIN
 LEFT JOIN RBPM.LIST_CL_BLACK B ON a.IIN = B.IIN
 LEFT JOIN RBPM.LIST_CL_RBO R ON a.IIN = R.IIN
WHERE 1=1
AND a.IIN = '123456789123'

You could also full outer join everything and put a coalesce/multiple or in the where. I left the WHERE 1=1 in on the assumption that you're programmatically concatenating other clauses on; if you arent, remove it

If you're only ever going to query one IIN you can:

SELECT 
 COALESCE(D.TERRORIST, 0) as TERRORIST,
 COALESCE(D.SPECIAL,0) as SPECIAL,
 COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
 COALESCE(B.ANOTHER, 0) as OSB,
 COALESCE(B.LSBOO,0) as LSBOO,
 COALESCE(R.DELAY,0) as DELAY
FROM 
 (
  SELECT '123456789123' AS IIN FROM DUAL
 ) x
 LEFT JOIN RBPM.LIST_CL_DWHFM D ON x.IIN = D.IIN
 LEFT JOIN RBPM.LIST_CL_TAXPAYER T ON x.IIN = T.IIN
 LEFT JOIN RBPM.LIST_CL_BLACK B ON x.IIN = B.IIN
 LEFT JOIN RBPM.LIST_CL_RBO R ON x.IIN = R.IIN

谜泪 2025-01-30 15:20:34

现在,它可以与空列一起使用,

SELECT 
     COALESCE(D.TERRORIST, 0) as TERRORIST,
     COALESCE(D.SPECIAL,0) as SPECIAL,
     COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
     COALESCE(B.ANOTHER, 0) as EX_OSB,
     COALESCE(B.LSBOO,0) as LSBOO,
     COALESCE(R.DELAY,0) as DELAY
    FROM 
     (
      SELECT IIN FROM RBPM.LIST_CL_DWHFM
      WHERE IIN = '123456789123'
      UNION
      SELECT IIN FROM RBPM.LIST_CL_TAXPAYER
      WHERE IIN = '123456789123'
      UNION
      SELECT IIN FROM RBPM.LIST_CL_BLACK
      WHERE IIN = '123456789123'
      UNION
      SELECT IIN FROM RBPM.LIST_CL_RBO
      WHERE IIN = '123456789123'
     ) ALLT
     LEFT JOIN RBPM.LIST_CL_DWHFM D ON ALLT.IIN = D.IIN
     LEFT JOIN RBPM.LIST_CL_TAXPAYER T ON ALLT.IIN = T.IIN
     LEFT JOIN RBPM.LIST_CL_BLACK B ON ALLT.IIN = B.IIN
     LEFT JOIN RBPM.LIST_CL_RBO R ON ALLT.IIN = R.IIN
    WHERE COALESCE(ALLT.IIN, '123456789123') = '123456789123'

谢谢Caius Jard

NOW IT WORKS WELL WITH NULL COLUMNS,

SELECT 
     COALESCE(D.TERRORIST, 0) as TERRORIST,
     COALESCE(D.SPECIAL,0) as SPECIAL,
     COALESCE(T.SIGN_INACTIVE, 0) as TAXPAYER,
     COALESCE(B.ANOTHER, 0) as EX_OSB,
     COALESCE(B.LSBOO,0) as LSBOO,
     COALESCE(R.DELAY,0) as DELAY
    FROM 
     (
      SELECT IIN FROM RBPM.LIST_CL_DWHFM
      WHERE IIN = '123456789123'
      UNION
      SELECT IIN FROM RBPM.LIST_CL_TAXPAYER
      WHERE IIN = '123456789123'
      UNION
      SELECT IIN FROM RBPM.LIST_CL_BLACK
      WHERE IIN = '123456789123'
      UNION
      SELECT IIN FROM RBPM.LIST_CL_RBO
      WHERE IIN = '123456789123'
     ) ALLT
     LEFT JOIN RBPM.LIST_CL_DWHFM D ON ALLT.IIN = D.IIN
     LEFT JOIN RBPM.LIST_CL_TAXPAYER T ON ALLT.IIN = T.IIN
     LEFT JOIN RBPM.LIST_CL_BLACK B ON ALLT.IIN = B.IIN
     LEFT JOIN RBPM.LIST_CL_RBO R ON ALLT.IIN = R.IIN
    WHERE COALESCE(ALLT.IIN, '123456789123') = '123456789123'

thanks Caius Jard

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文