• 《SQL Server 2012 T-SQL基础》读书笔记


    Chapter 6 Set Operators

    语法如下:

    Input Query1
    <set_operator>
    Input Query2
    [ORDER BY ...]
    

    有ORDER BY子句的查询不会返回一个set,而会返回一个cursor。上面的ORDER BY是对整个运算后的结果而言的。两个查询必须有相同数量的列,而且数据类型要兼容(低级的数据类型能隐式地转为高级的数据类型),结果集中的列名是由第一个查询的列名决定的。而且两个查询都不能有ORDER BY,如果你想用TOP什么的话,可以把它们分别封在一个表表达式里面。

    UNION ALL会返回一个multiset,也就是可以包含重复行的集合。而UNION会去掉重复行。

    INTERSECT会返回两个query的交集,结果不包含重复行。

    去掉重复行的时候,两个NULL是算作相等。

    SQL Server 2012没有提供“INTERSECT ALL”的功能,但是标准SQL有。INTERSECT ALL是这样的:对于两个集合中里面的相同的行,比如说第一个集合里面有三行(UK, NULL, London),第二个集合里面有五行(UK, NULL, London),那么最终的结果里面就有三行(UK, NULL, London),也就是取比较小的那个。这样很符合逻辑。如果想在SQL Server 2012中实现“INTERSECT ALL”的功能,就这样:

    SELECT
      ROW_NUMBER()
        OVER(PARTITION BY country, region, city
             ORDER BY (SELECT 0)) AS rownum,
      country, region, city
    FROM HR.Employees
    
    INTERSECT
    
    SELECT
      ROW_NUMBER()
        OVER(PARTITION BY country, region, city
             ORDER BY (SELECT 0)),
      country, region, city
    FROM Sales.Customers;
    

    这里的意思其实就是,把两个查询得到的相同的行都编个号,比如说第一个查询得到了三行(UK, NULL, London),那么我就把这三行编号成为1,2,3。第二个查询同理。
    ORDER BY (SELECT <constant>)的意思是:排序无关紧要。
    当然,结果中不应该包含编号这一列,那么你把上面那个定义成一个CTE,然后查询这个CTE就行了。

    A EXCEPT B就相当于集合中的A - B,如下图所示:

    EXCEPT ALL:如果第一个查询里面有5行X,第二个查询里面有3行X,那么结果就有2行X(5 - 3 = 2)要实现的话完全类似INTERSECT ALL,只要把其中的INTERSECT改成EXCEPT就行了。

    由于Set Operators的优先级不同,所以如果混用多个的话,记得加括号。

  • 相关阅读:
    知足老师对于脚跟酸经验
    《伤寒论》理论的临床应用--朱良春
    大便秘结案
    胃脘不适论治
    杏林集叶效方
    腰痛案(知足老师论辩证之重要性)
    小儿外感治疗误区
    小儿外感咳喘案
    漫谈凭脉用药--何少奇
    咽部不适案
  • 原文地址:https://www.cnblogs.com/raytheweak/p/7147862.html
Copyright © 2020-2023  润新知