【问题标题】:sql left outer join not working for multiple columnssql左外连接不适用于多列
【发布时间】:2015-01-07 10:22:22
【问题描述】:

我们有一个查询应该返回 5 个值,如果其中任何一个不在数据库中,则返回 n/a。这是查询

SELECT NVL(IR16.invoice_refnum_value, 'N/A') AS GL_CODE1,
       NVL(IR15.invoice_refnum_value, 'N/A') AS GL_AMOUNT1, 
       NVL(IR17.invoice_refnum_value, 'N/A') AS GL_RECEIVING_BU,
       NVL(IR18.invoice_refnum_value,'N/A') AS GL_SHIPPING_BU,
       NVL(IR19.invoice_refnum_value, 'N/A') AS GL_SALES_ORDER_NUMBER
    FROM   invoice i2 
    LEFT outer JOIN invoice_refnum ir16 
      ON i2.invoice_gid = ir16.invoice_gid 
    LEFT outer JOIN invoice_refnum ir15 
      ON i2.invoice_gid = ir15.invoice_gid
    LEFT outer JOIN invoice_refnum ir17 
      ON i2.invoice_gid = ir17.invoice_gid
    LEFT outer JOIN invoice_refnum ir18 
      ON i2.invoice_gid = ir18.invoice_gid
    LEFT outer JOIN invoice_refnum ir19 
      ON i2.invoice_gid = ir19.invoice_gid
    where ir15.invoice_refnum_qual_gid like 'GL AMOUNT%' 
      AND ir16.invoice_refnum_qual_gid like 'GL CODE%' 
      AND ir17.invoice_refnum_qual_gid like 'GL RECEIVING BU%'
      AND ir18.invoice_refnum_qual_gid like 'GL SHIPPING BU%'
      AND ir19.invoice_refnum_qual_gid like 'GL SALES ORDER NUMBER%'
      AND i2.invoice_gid = 'TEST' 
      and regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir15.invoice_refnum_qual_gid,'\d+$')
      and regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir17.invoice_refnum_qual_gid,'\d+$')
      and regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir18.invoice_refnum_qual_gid,'\d+$')
      and regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir19.invoice_refnum_qual_gid,'\d+$')

但是发生的情况是,如果任何时候都缺少一个引用句柄限定的值(即它不在数据库中),它只会省略整行。它不应该这样做,它应该只用 N/A 替换缺失值并显示其余 4 个值。

样本数据预期的工作方式如下:

  • 测试1 测试1 测试1 测试1 测试1
    • test2 test2 N/A test2 test2
    • test3 test3 test3 N/A test3
  • test4 test4 test4 test4 test4

目前的结果如何:

  • test1 test1 test1 test1 test1
  • test4 test4 test4 test4 test4

任何指针将不胜感激。我不知道我是否以正确的方式处理这件事!

【问题讨论】:

  • 您的 where 子句正在撤消外连接。将除第一个表之外的所有表中的条件移至相应的on 子句。
  • 完全不是同性恋,但我欠你一个拥抱,我需要做的就是:)谢谢!

标签: sql oracle


【解决方案1】:

您的 fromwhere 子句应该是:

FROM   invoice i2 
       LEFT outer JOIN invoice_refnum ir16 
              ON i2.invoice_gid = ir16.invoice_gid and ir16.invoice_refnum_qual_gid like 'GL CODE%'
       LEFT outer JOIN invoice_refnum ir15 
              ON i2.invoice_gid = ir15.invoice_gid and ir15.invoice_refnum_qual_gid like 'GL AMOUNT%'
       LEFT outer JOIN invoice_refnum ir17 
              ON i2.invoice_gid = ir17.invoice_gid and ir17.invoice_refnum_qual_gid like 'GL RECEIVING BU%'
       LEFT outer JOIN invoice_refnum ir18 
              ON i2.invoice_gid = ir18.invoice_gid and ir18.invoice_refnum_qual_gid like 'GL SHIPPING BU%'
       LEFT outer JOIN invoice_refnum ir19 
              ON i2.invoice_gid = ir19.invoice_gid and ir19.invoice_refnum_qual_gid like 'GL SALES ORDER NUMBER%' and
                 regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir15.invoice_refnum_qual_gid,'\d+$') and
                 regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir17.invoice_refnum_qual_gid,'\d+$') and
                 regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir18.invoice_refnum_qual_gid,'\d+$') and
                 regexp_substr(ir16.invoice_refnum_qual_gid,'\d+$') = regexp_substr( ir19.invoice_refnum_qual_gid,'\d+$')
WHERE i2.invoice_gid = 'TEST' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多