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
1.使用left join
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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谓词

1
2
3
4
5
6
7
8
9
10
11
12
13
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/cxd4321/p/3042878.html