在SQL中查找没有相关记录的记录

4

我有两个表(订单,订单项),它们基于一个名为OrderID的列相关联。我需要找到所有没有任何订单项的订单。


这很简单!事实上,我的支持团队中的一个人昨天也问了同样的问题。 - Mark Brittingham
3个回答

13
我们使用 JOIN 来查找相关数据。如果要查找没有任何相关数据的数据,可以使用反向 JOIN(anti-join)。
下面的语句连接表格,然后选择那些没有订单项目的数据。这种方法往往比使用 WHERE id NOT IN (...) 的查询更有效率。
select *
from
    Orders O
    left outer join OrderItems I
    on I.OrderId = O.Id
where
    I.Id is null

Aaron - 我可以想象左外连接更高效的方式,但你有具体的参考依据吗?我可能会避免使用这种结构,因为它增加了额外的复杂性,但如果存在明显的性能差异,对于大型数据集来说可能是合适的(对我而言)。 - Mark Brittingham
我没有具体的参考资料,这只是我从同事那里听到的一个断言,而且在我的经验中也经常发现是正确的。这个解决方案并不一定适用于每种情况,所以最好尝试每种方案并检查它们各自的执行计划,然后决定哪个是最好的。 - Aaron
1
经过一番搜索,我发现很多人对这个问题的想法与我相同。这里有一个相关链接:http://sqlserverpedia.com/blog/sql-server-bloggers/using-joins-instead-of-sub-queries-a-case-study/ - Aaron
谢谢 Aaron!非常有用的参考 - 我很感激你查找它所花费的努力。 - Mark Brittingham

7
Select * From Orders Where OrderID not in (Select Distinct OrderID From OrderItems)

2

尝试使用LEFT EXCEPTION JOIN

select *
from Orders
LEFT EXCEPTION JOIN OrderItems ON ...

我相信大多数数据库不支持异常连接。 - Maor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接