Intersect, Except, Union, All and Any(1)

--注:本文为意译,对原文进行了一些改变

在我浏览SQL Server 2008的培训课程时,发现了一些我在平日不太使用的SQL谓词:

  • Intersect
  • Except
  • ALL
  • ANY

我们将在AdventureWorks示例库上,试用这些谓词。

首先我们来看INTERSECT,EXCEPT,UNION

在实验中,我们将使用CustomerID的以下2个集合

  • 在sales territory 10(United Kingdom)中的客户
  • 在‘2004-07-01’后生成的订单

可能解释这三个谓词的最好方法是通过示意图,最上方的图表示在英国(UK)但未在2004-07-01后产生订单的客户,中间的图表示在英国且在2004-07-01后产生订单的客户,最下方的图标是在英国或在2004-07-01后产生订单的客户。

下面我们会来看看用不同的方式来实现EXCEPT逻辑

1.使用left join
select   
    C.CustomerID   
from   
    Sales.Customer as C   
    left join   
    Sales.SalesOrderHeader as OH   
    on   
        C.CustomerID = OH.CustomerID   
        and   
        OrderDate >= '2004-07-01'  
where   
    OH.CustomerID is null  
    and   
    C.TerritoryID = 10; 

生成的执行计划如下:

 

Subtree Cost: 0.615925

2. 使用NOT IN

select   
    CustomerID   
from   
    Sales.Customer   
where   
    TerritoryID=10   
    and   
    CustomerID    
        not in  
        (   
            select customerid   
            from  Sales.SalesOrderHeader   
            where OrderDate>='2004-07-01'    
        )  

生成的执行计划如下:

 

Subtree Cost: 0.614287

3. 使用EXCEPT谓词

select   
    CustomerID   
from   
    Sales.Customer   
where   
    TerritoryID = 10   
EXCEPT   
select   
    customerid   
from   
    Sales.SalesOrderHeader   
where   
    OrderDate >= '2004-07-01'  

生成的执行计划如下:

 

Subtree Cost: 0.614287

使用EXCEPT谓词和使用NOT IN的子树成本相同,且执行计划也相同。

原文地址:https://www.cnblogs.com/DBFocus/p/1739589.html