【问题标题】:Difference between subquery and correlated subquery for given code给定代码的子查询和相关子查询之间的区别
【发布时间】: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


【解决方案1】:

我在 SQL Server 2016 SP 上对自己的数据进行了类似的查询!:

select
*
from EXT.dbo_CUSTTABLE
where ACCOUNTNUM in 
(select CUSTACCOUNT from EXT.dbo_SALESLINE  b 
  where b.CREATEDDATETIME between '20170101 00:00' and '20170102 23:59');

select
*
from EXT.dbo_CUSTTABLE a
where exists 
(select * from EXT.dbo_SALESLINE b 
  where a.ACCOUNTNUM=b.CUSTACCOUNT 
    and b.CREATEDDATETIME between '20170101 00:00' and '20170102 23:59');

看看执行计划,它们是一样的!

如果我在 customer 表上添加一个聚集索引,在 salesline 上添加一个索引,我们将获得更高效的查询,使用索引查找和内部连接,而不是表扫描和哈希连接,但仍然相同!:

现在,如果您使用其他版本的 SQL Server,您的结果可能会有所不同,因为查询优化器会在版本之间发生变化。

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多