外部联接不显示额外条目

时间:2016-12-12 09:15:14

标签: sql database join outer-join

我做了一个查询,其中使用了3个表。第一个表格包含了我需要的所有名称。第2和第3个表格给出了那些有一些账单金额的名字。但我也需要第一张桌子上的所有名字。

SELECT   a.name,
         nvl(c.bill_amount,0)
    FROM  table_1 a left outer join table_2 b
    ON  a.name = b.name
    left outer join table_3 c on B.phone_number = C.phone_number
         AND B.email = C.email
         where  b.status = 'YES'
         and a.VALID = 'Y';

现在,表b和c给出了有限数量的名称,比方说5就是哪个账号。但是在table_1中,有10个名字。我想在他们的名字上显示0 bill_amount。我使用的是Oracle。

2 个答案:

答案 0 :(得分:1)

在右手上应用where子句基本上使其成为内连接。要保持OUTER,请将条件置于连接条件

尝试:

SELECT   a.name,
         nvl(c.bill_amount,0)
FROM  table_1 a 
left outer join table_2 b
  ON  a.name = b.name
  and b.status = 'YES'  -- Put it here
left outer join table_3 c 
  on B.phone_number = C.phone_number
  AND B.email = C.email
where a.VALID = 'Y';    -- Only items from the left hand table should go in the where clause

答案 1 :(得分:0)

上面的答案是正确的,我只想更准确。事实是当左连接不匹配时,右手表的列设置为NULL

实际上,NULL总是在SQL中传播值,因此如果连接不是数学,则b.status = 'YES'的值为NULL,然后谓词也不匹配。

处理此问题的一般方法是(b.status = 'YES' or b.name IS NULL):因为b.name是连接列,当且仅当连接不匹配时才为空,这可能不是{{1}的情况}。

由于b.status正在传播,因此您无法使用NULL,而是使用field = NULL

但是当它更清楚时,可以在join子句中使用它。