代码改变世界

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

  知行思新  阅读(893)  评论(0编辑  收藏  举报

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

在我浏览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的子树成本相同,且执行计划也相同。

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示