Rules for set operations

The following rules apply to UNION, EXCEPT, and INTERSECT statements:

  • Precedence   The UNION and EXCEPT operators have equal precedence and are both evaluated from left to right. The INTERSECT operator has a higher precedence than the UNION and EXCEPT operators and is also evaluated from left to right when more than one INTERSECT operator is used.

  • Same number of items in the SELECT lists   All SELECT lists in the queries must have the same number of expressions (such as column names, arithmetic expressions, and aggregate functions). The following statement is invalid because the first SELECT list is longer than the second:
    SELECT store_id, city, state
       FROM stores
    UNION
       SELECT store_id, city
         FROM stores_east;

  • Data types must match   Corresponding expressions in the SELECT lists must be of the same data type, or an implicit data conversion must be possible between the two data types, or an explicit conversion should be supplied.

    For example, a UNION, INTERSECT, or EXCEPT is not possible between a column of the CHAR data type and one of the INT data type, unless an explicit conversion is supplied. However, a set operation is possible between a column of the MONEY data type and one of the INT data type.

  • Column ordering   You must place corresponding expressions in the individual queries of a set operation in the same order, because the set operators compare the expressions one to one in the order given in the individual queries in the SELECT clauses.

  • Multiple set operations   You can string several set operations together, as in the following example:
    SELECT City AS Cities
       FROM Contacts
       UNION
          SELECT City
             FROM Customers
       UNION
          SELECT City
             FROM Employees;

    For UNION statements, the order of queries is not important. For INTERSECT, the order is important when there are two or more queries. For EXCEPT, the order is always important.

  • Column headings   The column names in the table resulting from a UNION are taken from the first individual query in the statement. If you want to define a new column heading for the result set, you can do so in the SELECT list of the first query, as in the following example:
    SELECT City AS Cities
       FROM Contacts
       UNION
          SELECT City
             FROM Customers;

    In the following query, the column heading remains as City, as it is defined in the first query of the UNION clause.

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

    Alternatively, you can use the WITH clause to define the column names. For example:

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

  • Ordering the results   You can use the WITH clause of the SELECT statement to order the column names in the SELECT list. For example:
    WITH V( CityName )
    AS ( SELECT City AS Cities
         FROM Contacts
         UNION
            SELECT City
               FROM Customers )
    SELECT * FROM V
       ORDER BY CityName;

    Alternatively, you can use a single ORDER BY clause at the end of the list of queries, but you must use integers rather than column names, as in the following example:

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