给定代码的子查询和相关子查询之间的区别

时间:2017-04-18 12:36:17

标签: tsql subquery correlated-subquery

书中给出的相关子查询的示例如下;

2007年2月12日下订单的客户

SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS
  (SELECT *
   FROM Sales.Orders AS O
   WHERE O.custid = C.custid
     AND O.orderdate = '20070212');

但是,我使用简单的子查询

为相同的目的编写了以下代码
SELECT custid, companyname
FROM Sales.Customers
WHERE custid IN
    (SELECT [custid] FROM [Sales].[Orders]
    WHERE [orderdate] ='20070212')

两者都提供相同的输出。哪种方法更好?为什么?我不明白在第一组代码中使用EXISTS

1 个答案:

答案 0 :(得分:1)

我在SQL Server 2016 SP上对我自己的数据尝试过类似的查询!:

[self.intensityLabel addSubview:intensityLevelView];

看看执行计划,它们是完全相同的!

enter image description here

如果我在customer表上添加聚簇索引,并在salesline上添加索引,我们会获得更有效的查询,使用索引查找和内部联接,而不是表扫描和散列连接,但仍然相同!:< / p>

enter image description here

现在,如果您使用的是其他版本的SQL Server,则结果可能会有所不同,因为查询优化器会在不同版本之间进行更改。