2000-01-06 07:40:54 +01:00
|
|
|
--
|
2000-10-05 21:11:39 +02:00
|
|
|
-- UNION (also INTERSECT, EXCEPT)
|
2000-01-06 07:40:54 +01:00
|
|
|
--
|
|
|
|
-- Simple UNION constructs
|
|
|
|
SELECT 1 AS two UNION SELECT 2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS one UNION SELECT 1;
|
|
|
|
one
|
|
|
|
-----
|
|
|
|
1
|
1998-05-29 15:22:42 +02:00
|
|
|
(1 row)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS two UNION ALL SELECT 2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS two UNION ALL SELECT 1;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1
|
|
|
|
1
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS three UNION SELECT 2 UNION SELECT 3;
|
|
|
|
three
|
|
|
|
-------
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
1998-05-29 15:22:42 +02:00
|
|
|
(3 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS two UNION SELECT 2 UNION SELECT 2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS three UNION SELECT 2 UNION ALL SELECT 2;
|
|
|
|
three
|
|
|
|
-------
|
|
|
|
1
|
|
|
|
2
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(3 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1.1 AS two UNION SELECT 2.2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1.1
|
|
|
|
2.2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
-- Mixed types
|
|
|
|
SELECT 1.1 AS two UNION SELECT 2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1.1
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1 AS two UNION SELECT 2.2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1
|
2000-10-05 21:11:39 +02:00
|
|
|
2.2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2003-11-02 23:35:26 +01:00
|
|
|
SELECT 1 AS one UNION SELECT 1.0::float8;
|
2000-01-06 07:40:54 +01:00
|
|
|
one
|
|
|
|
-----
|
|
|
|
1
|
1998-05-29 15:22:42 +02:00
|
|
|
(1 row)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT 1.1 AS two UNION ALL SELECT 2;
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1.1
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2003-11-02 23:35:26 +01:00
|
|
|
SELECT 1.0::float8 AS two UNION ALL SELECT 1;
|
2000-01-06 07:40:54 +01:00
|
|
|
two
|
|
|
|
-----
|
2003-11-02 23:35:26 +01:00
|
|
|
1
|
2000-01-06 07:40:54 +01:00
|
|
|
1
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-10-05 21:11:39 +02:00
|
|
|
SELECT 1.1 AS three UNION SELECT 2 UNION SELECT 3;
|
2000-01-06 07:40:54 +01:00
|
|
|
three
|
|
|
|
-------
|
2000-10-05 21:11:39 +02:00
|
|
|
1.1
|
2000-01-06 07:40:54 +01:00
|
|
|
2
|
|
|
|
3
|
1998-05-29 15:22:42 +02:00
|
|
|
(3 rows)
|
|
|
|
|
2003-11-02 23:35:26 +01:00
|
|
|
SELECT 1.1::float8 AS two UNION SELECT 2 UNION SELECT 2.0::float8;
|
2000-01-06 07:40:54 +01:00
|
|
|
two
|
|
|
|
-----
|
2000-10-05 21:11:39 +02:00
|
|
|
1.1
|
2000-01-06 07:40:54 +01:00
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(2 rows)
|
|
|
|
|
2000-10-05 21:11:39 +02:00
|
|
|
SELECT 1.1 AS three UNION SELECT 2 UNION ALL SELECT 2;
|
2000-01-06 07:40:54 +01:00
|
|
|
three
|
|
|
|
-------
|
2000-10-05 21:11:39 +02:00
|
|
|
1.1
|
2000-01-06 07:40:54 +01:00
|
|
|
2
|
|
|
|
2
|
1998-05-29 15:22:42 +02:00
|
|
|
(3 rows)
|
|
|
|
|
2000-10-05 21:11:39 +02:00
|
|
|
SELECT 1.1 AS two UNION (SELECT 2 UNION ALL SELECT 2);
|
|
|
|
two
|
|
|
|
-----
|
|
|
|
1.1
|
|
|
|
2
|
|
|
|
(2 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
--
|
|
|
|
-- Try testing from tables...
|
|
|
|
--
|
|
|
|
SELECT f1 AS five FROM FLOAT8_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION
|
|
|
|
SELECT f1 FROM FLOAT8_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
five
|
|
|
|
-----------------------
|
|
|
|
-1.2345678901234e+200
|
|
|
|
-1004.3
|
|
|
|
-34.84
|
|
|
|
-1.2345678901234e-200
|
|
|
|
0
|
1998-05-29 15:22:42 +02:00
|
|
|
(5 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS ten FROM FLOAT8_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION ALL
|
|
|
|
SELECT f1 FROM FLOAT8_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
ten
|
|
|
|
-----------------------
|
|
|
|
0
|
|
|
|
-34.84
|
|
|
|
-1004.3
|
|
|
|
-1.2345678901234e+200
|
|
|
|
-1.2345678901234e-200
|
|
|
|
0
|
|
|
|
-34.84
|
|
|
|
-1004.3
|
|
|
|
-1.2345678901234e+200
|
|
|
|
-1.2345678901234e-200
|
1998-05-29 15:22:42 +02:00
|
|
|
(10 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS nine FROM FLOAT8_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION
|
|
|
|
SELECT f1 FROM INT4_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
nine
|
|
|
|
-----------------------
|
|
|
|
-1.2345678901234e+200
|
|
|
|
-2147483647
|
|
|
|
-123456
|
|
|
|
-1004.3
|
|
|
|
-34.84
|
|
|
|
-1.2345678901234e-200
|
|
|
|
0
|
|
|
|
123456
|
|
|
|
2147483647
|
1998-05-29 15:22:42 +02:00
|
|
|
(9 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS ten FROM FLOAT8_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION ALL
|
|
|
|
SELECT f1 FROM INT4_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
ten
|
|
|
|
-----------------------
|
|
|
|
0
|
|
|
|
-34.84
|
|
|
|
-1004.3
|
|
|
|
-1.2345678901234e+200
|
|
|
|
-1.2345678901234e-200
|
|
|
|
0
|
|
|
|
123456
|
|
|
|
-123456
|
|
|
|
2147483647
|
|
|
|
-2147483647
|
1998-05-29 15:22:42 +02:00
|
|
|
(10 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS five FROM FLOAT8_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
WHERE f1 BETWEEN -1e6 AND 1e6
|
|
|
|
UNION
|
|
|
|
SELECT f1 FROM INT4_TBL
|
|
|
|
WHERE f1 BETWEEN 0 AND 1000000;
|
2000-01-06 07:40:54 +01:00
|
|
|
five
|
|
|
|
-----------------------
|
|
|
|
-1004.3
|
|
|
|
-34.84
|
|
|
|
-1.2345678901234e-200
|
|
|
|
0
|
|
|
|
123456
|
1998-05-29 15:22:42 +02:00
|
|
|
(5 rows)
|
|
|
|
|
2003-05-26 02:11:29 +02:00
|
|
|
SELECT CAST(f1 AS char(4)) AS three FROM VARCHAR_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION
|
|
|
|
SELECT f1 FROM CHAR_TBL;
|
2003-05-26 02:11:29 +02:00
|
|
|
three
|
|
|
|
-------
|
2000-01-06 07:40:54 +01:00
|
|
|
a
|
|
|
|
ab
|
|
|
|
abcd
|
2003-05-26 02:11:29 +02:00
|
|
|
(3 rows)
|
1998-05-29 15:22:42 +02:00
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS three FROM VARCHAR_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION
|
2003-05-26 02:11:29 +02:00
|
|
|
SELECT CAST(f1 AS varchar) FROM CHAR_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
three
|
|
|
|
-------
|
|
|
|
a
|
|
|
|
ab
|
|
|
|
abcd
|
1998-05-29 15:22:42 +02:00
|
|
|
(3 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS eight FROM VARCHAR_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION ALL
|
|
|
|
SELECT f1 FROM CHAR_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
eight
|
|
|
|
-------
|
|
|
|
a
|
|
|
|
ab
|
|
|
|
abcd
|
|
|
|
abcd
|
2003-05-26 02:11:29 +02:00
|
|
|
a
|
|
|
|
ab
|
2000-01-06 07:40:54 +01:00
|
|
|
abcd
|
|
|
|
abcd
|
1998-05-29 15:22:42 +02:00
|
|
|
(8 rows)
|
|
|
|
|
2000-01-06 07:40:54 +01:00
|
|
|
SELECT f1 AS five FROM TEXT_TBL
|
1998-05-29 15:22:42 +02:00
|
|
|
UNION
|
|
|
|
SELECT f1 FROM VARCHAR_TBL
|
|
|
|
UNION
|
|
|
|
SELECT TRIM(TRAILING FROM f1) FROM CHAR_TBL;
|
2000-01-06 07:40:54 +01:00
|
|
|
five
|
|
|
|
-------------------
|
|
|
|
a
|
|
|
|
ab
|
|
|
|
abcd
|
|
|
|
doh!
|
|
|
|
hi de ho neighbor
|
1998-05-29 15:22:42 +02:00
|
|
|
(5 rows)
|
|
|
|
|
2000-10-05 21:11:39 +02:00
|
|
|
--
|
|
|
|
-- INTERSECT and EXCEPT
|
|
|
|
--
|
|
|
|
SELECT q2 FROM int8_tbl INTERSECT SELECT q1 FROM int8_tbl;
|
|
|
|
q2
|
|
|
|
------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
SELECT q2 FROM int8_tbl INTERSECT ALL SELECT q1 FROM int8_tbl;
|
|
|
|
q2
|
|
|
|
------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
4567890123456789
|
|
|
|
(3 rows)
|
|
|
|
|
|
|
|
SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl;
|
|
|
|
q2
|
|
|
|
-------------------
|
|
|
|
-4567890123456789
|
|
|
|
456
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT q1 FROM int8_tbl;
|
|
|
|
q2
|
|
|
|
-------------------
|
|
|
|
-4567890123456789
|
|
|
|
456
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
SELECT q2 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q1 FROM int8_tbl;
|
|
|
|
q2
|
|
|
|
-------------------
|
|
|
|
-4567890123456789
|
|
|
|
456
|
|
|
|
4567890123456789
|
|
|
|
(3 rows)
|
|
|
|
|
2000-11-09 03:47:49 +01:00
|
|
|
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl;
|
|
|
|
q1
|
|
|
|
----
|
|
|
|
(0 rows)
|
|
|
|
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT q2 FROM int8_tbl;
|
|
|
|
q1
|
|
|
|
------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT ALL SELECT DISTINCT q2 FROM int8_tbl;
|
|
|
|
q1
|
|
|
|
------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
4567890123456789
|
|
|
|
(3 rows)
|
|
|
|
|
2000-10-05 21:11:39 +02:00
|
|
|
--
|
|
|
|
-- Mixed types
|
|
|
|
--
|
|
|
|
SELECT f1 FROM float8_tbl INTERSECT SELECT f1 FROM int4_tbl;
|
|
|
|
f1
|
|
|
|
----
|
|
|
|
0
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT f1 FROM float8_tbl EXCEPT SELECT f1 FROM int4_tbl;
|
|
|
|
f1
|
|
|
|
-----------------------
|
|
|
|
-1.2345678901234e+200
|
|
|
|
-1004.3
|
|
|
|
-34.84
|
|
|
|
-1.2345678901234e-200
|
|
|
|
(4 rows)
|
|
|
|
|
2000-11-09 03:47:49 +01:00
|
|
|
--
|
|
|
|
-- Operator precedence and (((((extra))))) parentheses
|
|
|
|
--
|
|
|
|
SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl;
|
|
|
|
q1
|
|
|
|
-------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
456
|
|
|
|
4567890123456789
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
-4567890123456789
|
|
|
|
(7 rows)
|
|
|
|
|
|
|
|
SELECT q1 FROM int8_tbl INTERSECT (((SELECT q2 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl)));
|
|
|
|
q1
|
|
|
|
------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
(((SELECT q1 FROM int8_tbl INTERSECT SELECT q2 FROM int8_tbl))) 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;
|
|
|
|
q1
|
|
|
|
-------------------
|
|
|
|
-4567890123456789
|
|
|
|
456
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
SELECT q1 FROM int8_tbl UNION ALL (((SELECT q2 FROM int8_tbl EXCEPT SELECT q1 FROM int8_tbl)));
|
|
|
|
q1
|
|
|
|
-------------------
|
|
|
|
123
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
4567890123456789
|
|
|
|
4567890123456789
|
|
|
|
-4567890123456789
|
|
|
|
456
|
|
|
|
(7 rows)
|
|
|
|
|
|
|
|
(((SELECT q1 FROM int8_tbl UNION ALL SELECT q2 FROM int8_tbl))) EXCEPT SELECT q1 FROM int8_tbl;
|
|
|
|
q1
|
|
|
|
-------------------
|
|
|
|
-4567890123456789
|
|
|
|
456
|
|
|
|
(2 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)
|
|
|
|
|
|
|
|
-- This should fail, because q2 isn't a name of an EXCEPT output column
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1;
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: column "q2" does not exist
|
2000-11-09 03:47:49 +01:00
|
|
|
-- But this should work:
|
|
|
|
SELECT q1 FROM int8_tbl EXCEPT (((SELECT q2 FROM int8_tbl ORDER BY q2 LIMIT 1)));
|
|
|
|
q1
|
|
|
|
------------------
|
|
|
|
123
|
|
|
|
4567890123456789
|
|
|
|
(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)
|
|
|
|
|