zoukankan      html  css  js  c++  java
  • 《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的优先级不同,所以如果混用多个的话,记得加括号。

  • 相关阅读:
    读书笔记Review: HTTP and HttpServletRequest
    读书笔记JavaScript Patterns_chapter6_Code Reuse Patterns
    读书笔记Review: servlet lifecycle and API
    读书笔记Review: HttpServletResponse
    简单分析Ext.ComponentMgr 函数
    翻译 Extjs in action中的Event flow in the DOM
    struts中的web.xml
    读书笔记_Extjs In Action_The Component Life Cycle
    web service中的事件
    Remoting学习笔记
  • 原文地址:https://www.cnblogs.com/raytheweak/p/7147862.html
Copyright © 2011-2022 走看看