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

  • 相关阅读:
    Navicat
    Eclipse 代码质量管理插件
    oracle sql 逻辑处理
    view视图 | 索引
    LIKE模糊查询
    启动tomcat报找不到或无法加载主类
    oracle:decode
    oracle:case when then else end
    ssh 公共秘钥
    ip 和数字之间的转换
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1739589.html
Copyright © 2020-2023  润新知