我有一个locnew
表,该表具有仓库中所有位置的名称,因此:
1 | acb1
2 | acb7
3 | aba2
i还有一个location
表,该表会将产品分配到位置,因此它将具有locnew id(location_description_id
),然后是产品的所有详细信息。我写了这个查询来显示每个位置的所有项目:
select l.*
, ln.location_description
from location l
join locnew ln
on ln.id = l.location_description_id
where l.location_description_id != 376
这给了我他们所处位置的所有库存
是否有一种不使用的方法可以解决这个问题,所以我可以在位置表中找到所有未分配任何产品的“ locnew” ID的列表?
答案 0 :(得分:1)
您可以使用左联接
select l.*, ln.location_description
from location l
left join locnew ln
on ln.id = l.location_description_id
where ln.id is null
联接在概念上被定义为数学中的集合运算。
加入后,您将获得两个集合的交集。
离开联接时,您将采用两个集合的交集加上左边(第一个表)集合的其余成员。
当您右加入时,您将采用两个集合的交集以及右边(第二个表)集合的其余成员。
但是,如您所见,这三个选项均无法满足您的需求。您需要的是左侧集中的剩余零件。这就是将ln.id为null添加到where子句的原因。如果右侧没有记录,则ln.is为空,查询将为您提供所需的内容。
答案 1 :(得分:0)
此查询将为您提供所需的结果:
SELECT * FROM locnew ln
WHERE NOT EXISTS(SELECT 1 FROM location
WHERE location_description_id = l.id)