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

  • 相关阅读:
    Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程) Java大师
    idea30天免费试用,看看到底好不好用 Java大师
    TypeScript学习001
    [PE 741] Binary grid colouring
    ORACLE 查看被锁的表、导致锁表的目标机器、及对应锁表语句
    Hook Formulae and Schubert Calculus
    7个葫芦娃的养鸡日记系列1
    protobuf 'NoneType' object has no attribute 'message_types_by_name'
    windows bat 跳转到当前目录执行命令
    Android64位库编译遇到的问题和处理方法
  • 原文地址:https://www.cnblogs.com/cxd4321/p/3042878.html
Copyright © 2020-2023  润新知