【发布时间】:2017-04-18 12:36:17
【问题描述】:
书中给出的相关子查询示例如下;
在 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在第一组代码中的使用
【问题讨论】:
-
您可以阅读这里(stackoverflow.com/questions/2065329/…),根据您使用的 SQL Server 版本,性能可能会有所不同。正如您在答案和 cmets 中看到的,从 2008 年起,优化器将平等对待 IN 和 EXISTS。
-
EXISTS 评估选择,如果 SELECT 返回行,则 EXISTS 评估为 TRUE,否则为 FALSE。最有效的方法可能是最好的;)要知道有什么不同,您必须研究查询的执行计划。很可能您获得了相同的执行计划,这意味着这两个查询实际上是相同的。
标签: tsql subquery correlated-subquery