Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 对查询结果进行汇总、分组和排序 » 使用 UNION、INTERSECT 和 EXCEPT 对查询结果执行集合运算

 

集合运算的规则

以下规则适用于 UNION、EXCEPT 和 INTERSECT 语句:

  • 选择列表中项的数目相同   查询中的所有选择列表都必须具有相同数目的表达式(如列名、算术表达式和集合函数)。以下语句是无效的,因为第一个选择列表比第二个选择列表长:
    SELECT store_id, city, state
       FROM stores
    UNION
       SELECT store_id, city
         FROM stores_east;

  • 数据类型必须匹配   SELECT 列表中的相应表达式必须属于同一数据类型,或者在两种数据类型之间必须能够进行隐式数据转换,或者应提供显式转换。

    例如,除非提供显式转换,否则在 CHAR 数据类型的列和 INT 数据类型的列之间无法进行 UNION、INTERSECT 或 EXCEPT 运算。不过,在 MONEY 数据类型的列和 INT 数据类型的列之间可以进行集合运算。

  • 列排序   您必须以相同的顺序将相应的表达式放置于集合运算的各个查询中,因为集合运算将按 SELECT 子句的各个查询中给定的顺序一一比较这些表达式。

  • 多个集合运算   您可以将若干个集合运算排列在一起,如以下示例所示:
    SELECT City AS Cities
       FROM Contacts
       UNION
          SELECT City
             FROM Customers
       UNION
          SELECT City
             FROM Employees;

    对于 UNION 语句,查询的顺序并不重要。对于 INTERSECT,当存在两个或多个查询时顺序是很重要的。对于 EXCEPT,顺序在任何情况下都很重要。

  • 列标题   由 UNION 运算生成的表中的列名是从该语句中的第一个单独查询中获取的。如果要为结果集定义新的列标题,可以在第一个查询的选择列表中执行该操作,如以下示例所示:
    SELECT City AS Cities
       FROM Contacts
       UNION
          SELECT City
             FROM Customers;

    在以下查询中,列标题仍为 City,即 UNION 语句的第一个查询中定义的列标题。

    SELECT City
       FROM Contacts
       UNION
          SELECT City AS Cities
             FROM Customers;

    也可以使用 WITH 子句来定义列名。例如:

    WITH V( Cities )
    AS ( SELECT City
         FROM Contacts
         UNION
            SELECT City
             FROM Customers )
    SELECT * FROM V;

  • 对结果进行排序   可以使用 SELECT 语句的 WITH 子句对选择列表中的列名进行排序。例如:
    WITH V( CityName )
    AS ( SELECT City AS Cities
         FROM Contacts
         UNION
            SELECT City
               FROM Customers )
    SELECT * FROM V
       ORDER BY CityName;

    您也可以在查询列表的末尾使用单个 ORDER BY 子句,但必须使用整数而不是列名,如以下示例所示:

    SELECT City AS Cities
       FROM Contacts
       UNION
          SELECT City
            FROM Customers
       ORDER BY 1;