我在PostgreSQL

时间:2016-06-03 21:38:42

标签: postgresql left-join outer-join

我要做的是获取parts的所有记录以及oelineitem parts.id等于owlineitems.part_id的所有记录,我还需要一些来自表oe

对于oe中的每一行(多对一关系),我保证在oelineitems中有一行但我无法保证oelineitem中的每行parts中的一行1}}。即使oelineitem中没有行,我也需要parts中的行在数据集中。

我的查询:

SELECT parts.partnumber, 
       parts.description, 
       parts.bin, 
       parts.obsolete, 
       orderitems.qty, 
       oe.transdate 
FROM   parts 
LEFT JOIN orderitems 
       ON parts.id = orderitems.parts_id
LEFT JOIN oe 
       ON orderitems.trans_id = oe.id 
WHERE  oe.customer_id <> 12228
ORDER  BY part.partnumber; 

1 个答案:

答案 0 :(得分:2)

将条件从WHERE移至ON:

SELECT parts.partnumber, 
       parts.description, 
       parts.bin, 
       parts.obsolete, 
       orderitems.qty, 
       oe.transdate 
FROM   parts 
LEFT JOIN orderitems 
       ON parts.id = orderitems.parts_id
LEFT JOIN oe 
       ON orderitems.trans_id = oe.id 
       AND oe.customer_id <> 12228
ORDER  BY part.partnumber;

您是外部加入记录。因此,如果没有匹配,则加入一个所有列为NULL的虚拟记录。如果您要求WHERE oe.customer_id <> 12228解雇这些记录,那么您将删除所有外部联接的记录,并且只是内部联接的位置。

(因为NULL <> 12228导致null,而不是true。)