-- -- UNION (also INTERSECT, EXCEPT) -- -- Simple UNION constructs SELECT 1 AS two UNION SELECT 2 ORDER BY 1; two ----- 1 2 (2 rows) SELECT 1 AS one UNION SELECT 1 ORDER BY 1; one ----- 1 (1 row) SELECT 1 AS two UNION ALL SELECT 2; two ----- 1 2 (2 rows) SELECT 1 AS two UNION ALL SELECT 1; two ----- 1 1 (2 rows) SELECT 1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1; three ------- 1 2 3 (3 rows) SELECT 1 AS two UNION SELECT 2 UNION SELECT 2 ORDER BY 1; two ----- 1 2 (2 rows) SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1; three ------- 1 2 2 (3 rows) SELECT 1.1 AS two UNION SELECT 2.2 ORDER BY 1; two ----- 1.1 2.2 (2 rows) -- Mixed types SELECT 1.1 AS two UNION SELECT 2 ORDER BY 1; two ----- 1.1 2 (2 rows) SELECT 1 AS two UNION SELECT 2.2 ORDER BY 1; two ----- 1 2.2 (2 rows) SELECT 1 AS one UNION SELECT 1.0::float8 ORDER BY 1; one ----- 1 (1 row) SELECT 1.1 AS two UNION ALL SELECT 2 ORDER BY 1; two ----- 1.1 2 (2 rows) SELECT 1.0::float8 AS two UNION ALL SELECT 1 ORDER BY 1; two ----- 1 1 (2 rows) SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3 ORDER BY 1; three ------- 1.1 2 3 (3 rows) SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8 ORDER BY 1; two ----- 1.1 2 (2 rows) SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2 ORDER BY 1; three ------- 1.1 2 2 (3 rows) SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2) ORDER BY 1; two ----- 1.1 2 (2 rows) SELECT f1 AS three FROM VARCHAR_TBL UNION SELECT CAST(f1 AS varchar) FROM CHAR_TBL ORDER BY 1; three ------- a ab abcd (3 rows) SELECT f1 AS eight FROM VARCHAR_TBL UNION ALL SELECT f1 FROM CHAR_TBL; eight ------- a ab abcd abcd a ab abcd abcd (8 rows) SELECT f1 AS five FROM TEXT_TBL UNION SELECT f1 FROM VARCHAR_TBL UNION SELECT TRIM(TRAILING FROM f1) FROM CHAR_TBL ORDER BY 1; five ------------------- a ab abcd doh! hi de ho neighbor (5 rows) -- -- INTERSECT and EXCEPT -- SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl ORDER BY 1; q2 ------------------ 123 4567890123456789 (2 rows) SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl ORDER BY 1; q2 ------------------ 123 4567890123456789 4567890123456789 (3 rows) SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1; q2 ------------------- -4567890123456789 456 (2 rows) SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl ORDER BY 1; q2 ------------------- -4567890123456789 456 (2 rows) SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl ORDER BY 1; q2 ------------------- -4567890123456789 456 4567890123456789 (3 rows) SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl ORDER BY 1; q1 ------------------ 123 4567890123456789 (2 rows) SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl ORDER BY 1; q1 ------------------ 123 4567890123456789 4567890123456789 (3 rows) -- nested cases (SELECT 1,2,3 UNION SELECT 4,5,6) INTERSECT SELECT 4,5,6; ?column? | ?column? | ?column? ----------+----------+---------- 4 | 5 | 6 (1 row) (SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6; ?column? | ?column? | ?column? ----------+----------+---------- 4 | 5 | 6 (1 row) (SELECT 1,2,3 UNION SELECT 4,5,6) EXCEPT SELECT 4,5,6; ?column? | ?column? | ?column? ----------+----------+---------- 1 | 2 | 3 (1 row) (SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) EXCEPT SELECT 4,5,6; ?column? | ?column? | ?column? ----------+----------+---------- 1 | 2 | 3 (1 row) select count(*) from ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; count ------- 10000 (1 row) select count(*) from ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; count ------- 5000 (1 row) select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; unique1 --------- 10 (1 row) select count(*) from ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; count ------- 10000 (1 row) select count(*) from ( select unique1 from tenk1 intersect select fivethous from tenk1 ) ss; count ------- 5000 (1 row) select unique1 from tenk1 except select unique2 from tenk1 where unique2 != 10; unique1 --------- 10 (1 row) select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); x ------- {1,2} (1 row) select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); x ------- {1,3} (1 row) select x from (values (array[1, 2]), (array[1, 3])) _(x) intersect select x from (values (array[1, 2]), (array[1, 4])) _(x); x ------- {1,2} (1 row) select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (values (array[1, 2]), (array[1, 4])) _(x); x ------- {1,3} (1 row) -- -- Operator precedence and (((((extra))))) parentheses -- SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl ORDER BY 1; q1 ------------------- -4567890123456789 123 123 456 4567890123456789 4567890123456789 4567890123456789 (7 rows) SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) ORDER BY 1; q1 ------------------ 123 4567890123456789 (2 rows) (((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl ORDER BY 1))) UNION ALL SELECT q2 FROM int8_tbl; q1 ------------------- 123 4567890123456789 456 4567890123456789 123 4567890123456789 -4567890123456789 (7 rows) SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl ORDER BY 1))); q1 ------------------- 123 123 4567890123456789 4567890123456789 4567890123456789 -4567890123456789 456 (7 rows) -- -- Subqueries with ORDER BY & LIMIT clauses -- -- In this syntax, ORDER BY/LIMIT apply to the result of the EXCEPT SELECT q1,q2 FROM int8_tbl EXCEPT SELECT q2,q1 FROM int8_tbl ORDER BY q2,q1; q1 | q2 ------------------+------------------- 4567890123456789 | -4567890123456789 123 | 456 (2 rows) -- -- New syntaxes (7.1) permit new tests -- (((((select * from int8_tbl))))); q1 | q2 ------------------+------------------- 123 | 456 123 | 4567890123456789 4567890123456789 | 123 4567890123456789 | 4567890123456789 4567890123456789 | -4567890123456789 (5 rows) -- -- Check handling of a case with unknown constants. We don't guarantee -- an undecorated constant will work in all cases, but historically this -- usage has worked, so test we don't break it. -- SELECT a.f1 FROM (SELECT 'test' AS f1 FROM varchar_tbl) a UNION SELECT b.f1 FROM (SELECT f1 FROM varchar_tbl) b ORDER BY 1; f1 ------ a ab abcd test (4 rows) -- This should fail, but it should produce an error cursor SELECT '3.4'::numeric UNION SELECT 'foo'; ERROR: invalid input syntax for type numeric: "foo" LINE 1: SELECT '3.4'::numeric UNION SELECT 'foo'; ^ -- -- Test that expression-index constraints can be pushed down through -- UNION or UNION ALL -- CREATE TEMP TABLE t1 (a text, b text); CREATE TEMP TABLE t2 (ab text primary key); INSERT INTO t1 VALUES ('a', 'b'), ('x', 'y'); INSERT INTO t2 VALUES ('ab'), ('xy'); -- -- Test that ORDER BY for UNION ALL can be pushed down to inheritance -- children. -- CREATE TEMP TABLE t1c (b text, a text); INSERT INTO t1c VALUES ('v', 'w'), ('c', 'd'), ('m', 'n'), ('e', 'f'); -- This simpler variant of the above test has been observed to fail differently create table events (event_id int primary key); create table other_events (event_id int primary key); drop table events_child, events, other_events; SELECT * FROM (SELECT 1 AS t, 2 AS x UNION SELECT 2 AS t, 4 AS x) ss WHERE x < 4 ORDER BY x; t | x ---+--- 1 | 2 (1 row) SELECT * FROM (SELECT 1 AS t, (random()*3)::int AS x UNION SELECT 2 AS t, 4 AS x) ss WHERE x > 3 ORDER BY x; t | x ---+--- 2 | 4 (1 row) select distinct q1 from (select distinct * from int8_tbl i81 union all select distinct * from int8_tbl i82) ss where q2 = q2; q1 ------------------ 123 4567890123456789 (2 rows) select distinct q1 from (select distinct * from int8_tbl i81 union all select distinct * from int8_tbl i82) ss where -q1 = q2; q1 ------------------ 4567890123456789 (1 row)