You can combine multiple queries using the set operators UNION
, UNION
ALL
, INTERSECT
, and MINUS
. All set operators have equal precedence. If a SQL statement contains multiple set operators, then Oracle evaluates them from the left to right if no parentheses explicitly specify another order.
The corresponding expressions in the select lists of the component queries of a compound query must match in number and datatype. If component queries select character data, then the datatype of the return values are determined as follows:
CHAR
, then the returned values have datatype CHAR
. VARCHAR2
, then the returned values have datatype VARCHAR2
. BLOB
, CLOB
, BFILE
, VARRAY
, or nested table. UNION
, INTERSECT
, and MINUS
operators are not valid on LONG
columns. order_by_clause
. for_update_clause
with these set operators. order_by_clause
in the subquery
of these operators. SELECT
statements containing TABLE
collection expressions.
The following examples combine the two query results with each of the set operators.
The following statement combines the results with the UNION
operator, which eliminates duplicate selected rows. This statement shows that you must match datatype (using the TO_CHAR
function) when columns do not exist in one or the other table:
SELECT location_id, department_name "Department", TO_CHAR(NULL) "Warehouse" FROM departments UNION SELECT location_id, TO_CHAR(NULL) "Department", warehouse_name FROM warehouses; LOCATION_ID Department Warehouse ----------- --------------------- -------------------------- 1400 IT 1400 Southlake, Texas 1500 Shipping 1500 San Francisco 1600 New Jersey 1700 Accounting 1700 Administration 1700 Benefits 1700 Construction ...
The UNION
operator returns only distinct rows that appear in either result, while the UNION
ALL
operator returns all rows. The UNION
ALL
operator does not eliminate duplicate selected rows:
SELECT product_id FROM order_items UNION SELECT product_id FROM inventories; SELECT location_id FROM locations UNION ALL SELECT location_id FROM departments;
A location_id
value that appears multiple times in either or both queries (such as '1700
') is returned only once by the UNION
operator, but multiple times by the UNION
ALL
operator.
The following statement combines the results with the INTERSECT
operator, which returns only those rows returned by both queries:
SELECT product_id FROM inventories INTERSECT SELECT product_id FROM order_items;
The following statement combines results with the MINUS
operator, which returns only rows returned by the first query but not by the second:
SELECT product_id FROM inventories MINUS SELECT product_id FROM order_items;