123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- --
- -- 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)
|