我要做的是获取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;
答案 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。)