我做了一个查询,其中使用了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。
答案 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子句中使用它。