假设我们有两个表
客户和订单
客户表: -
custid custname
------- ---------
1 aaa
2 bbb
3 ccc
订单表: -
orderid custid date
-------- ------ -----
101 1 2016-03-01
102 1 2016-03-03
103 2 2016-03-01
现在,我们已经展示了没有订单的客户
我们可以通过以下几种方式实现: -
1.没有加入
Select custid
from Customers
where custid not in
(Select custid from Orders)
和
2.加入
Select C.custid
from Customers C left join Orders O
on C.custid = O.custid
where O.orderid is null
我被问到会有任何性能差异吗?如果,哪个会做得更好以及为什么?
答案 0 :(得分:2)
两个查询都不同,因此比较无效..查询相同/获得相同的执行计划..
1.使用Not IN
*
Not Exists
如果你这样做,你可能会得到同样的计划,同时进行同样的处理......
*为什么要求删除Not IN
,除了涉及空值时可能会给你带来奇怪结果的原因之外,可以从这个答案中找到Not IN vs Not Exists
从答案中粘贴相关条款..
目前执行计划可能相同,但如果将来更改任一列以允许NULL,NOT IN版本将需要做更多工作(即使数据中实际上没有NULL)和语义NOT IN如果存在NULL则不太可能是你想要的那些。