2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- JOIN
|
2000-09-12 23:07:18 +02:00
|
|
|
-- Test JOIN clauses
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
2000-02-15 04:31:33 +01:00
|
|
|
CREATE TABLE J1_TBL (
|
1999-02-23 08:27:13 +01:00
|
|
|
i integer,
|
|
|
|
j integer,
|
2000-01-09 04:48:39 +01:00
|
|
|
t text
|
1999-02-23 08:27:13 +01:00
|
|
|
);
|
2000-02-15 04:31:33 +01:00
|
|
|
CREATE TABLE J2_TBL (
|
1999-02-23 08:27:13 +01:00
|
|
|
i integer,
|
|
|
|
k integer
|
|
|
|
);
|
2000-01-09 04:48:39 +01:00
|
|
|
CREATE TABLE JOIN3_TBL (
|
|
|
|
i integer,
|
|
|
|
j integer,
|
|
|
|
y integer
|
|
|
|
);
|
|
|
|
CREATE TABLE JOIN4_TBL (
|
|
|
|
k integer,
|
|
|
|
z integer
|
|
|
|
);
|
2000-02-15 04:31:33 +01:00
|
|
|
INSERT INTO J1_TBL VALUES (1, 3, 'one');
|
|
|
|
INSERT INTO J1_TBL VALUES (2, 2, 'two');
|
|
|
|
INSERT INTO J1_TBL VALUES (3, 1, 'three');
|
|
|
|
INSERT INTO J1_TBL VALUES (4, 0, 'four');
|
|
|
|
INSERT INTO J2_TBL VALUES (1, -1);
|
|
|
|
INSERT INTO J2_TBL VALUES (2, 2);
|
|
|
|
INSERT INTO J2_TBL VALUES (3, -3);
|
|
|
|
INSERT INTO J2_TBL VALUES (2, 4);
|
2000-09-12 23:07:18 +02:00
|
|
|
INSERT INTO J2_TBL VALUES (5, -5);
|
2000-02-15 04:31:33 +01:00
|
|
|
--
|
|
|
|
-- CORRELATION NAMES
|
|
|
|
-- Make sure that table/column aliases are supported
|
|
|
|
-- before diving into more complex join syntax.
|
|
|
|
--
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL AS tx;
|
|
|
|
xxx | i | j | t
|
|
|
|
-----+---+---+-------
|
|
|
|
| 1 | 3 | one
|
|
|
|
| 2 | 2 | two
|
|
|
|
| 3 | 1 | three
|
|
|
|
| 4 | 0 | four
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL tx;
|
|
|
|
xxx | i | j | t
|
|
|
|
-----+---+---+-------
|
|
|
|
| 1 | 3 | one
|
|
|
|
| 2 | 2 | two
|
|
|
|
| 3 | 1 | three
|
|
|
|
| 4 | 0 | four
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL AS t1 (a, b, c);
|
|
|
|
xxx | a | b | c
|
|
|
|
-----+---+---+-------
|
|
|
|
| 1 | 3 | one
|
|
|
|
| 2 | 2 | two
|
|
|
|
| 3 | 1 | three
|
|
|
|
| 4 | 0 | four
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b, c);
|
|
|
|
xxx | a | b | c
|
|
|
|
-----+---+---+-------
|
|
|
|
| 1 | 3 | one
|
|
|
|
| 2 | 2 | two
|
|
|
|
| 3 | 1 | three
|
|
|
|
| 4 | 0 | four
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
|
|
|
|
xxx | a | b | c | d | e
|
|
|
|
-----+---+---+-------+---+----
|
|
|
|
| 1 | 3 | one | 1 | -1
|
|
|
|
| 1 | 3 | one | 2 | 2
|
|
|
|
| 1 | 3 | one | 3 | -3
|
|
|
|
| 1 | 3 | one | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 1 | 3 | one | 5 | -5
|
|
|
|
| 2 | 2 | two | 1 | -1
|
|
|
|
| 2 | 2 | two | 2 | 2
|
|
|
|
| 2 | 2 | two | 3 | -3
|
2000-02-15 04:31:33 +01:00
|
|
|
| 2 | 2 | two | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 2 | 2 | two | 5 | -5
|
|
|
|
| 3 | 1 | three | 1 | -1
|
|
|
|
| 3 | 1 | three | 2 | 2
|
|
|
|
| 3 | 1 | three | 3 | -3
|
2000-02-15 04:31:33 +01:00
|
|
|
| 3 | 1 | three | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 3 | 1 | three | 5 | -5
|
|
|
|
| 4 | 0 | four | 1 | -1
|
|
|
|
| 4 | 0 | four | 2 | 2
|
|
|
|
| 4 | 0 | four | 3 | -3
|
2000-02-15 04:31:33 +01:00
|
|
|
| 4 | 0 | four | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 4 | 0 | four | 5 | -5
|
|
|
|
(20 rows)
|
2000-02-15 04:31:33 +01:00
|
|
|
|
|
|
|
SELECT '' AS "xxx", t1.a, t2.e
|
|
|
|
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e)
|
|
|
|
WHERE t1.a = t2.d;
|
|
|
|
xxx | a | e
|
|
|
|
-----+---+----
|
|
|
|
| 1 | -1
|
|
|
|
| 2 | 2
|
|
|
|
| 2 | 4
|
|
|
|
| 3 | -3
|
|
|
|
(4 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- CROSS JOIN
|
|
|
|
-- Qualifications are not allowed on cross joins,
|
|
|
|
-- which degenerate into a standard unqualified inner join.
|
|
|
|
--
|
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL CROSS JOIN J2_TBL;
|
2000-01-09 04:48:39 +01:00
|
|
|
xxx | i | j | t | i | k
|
|
|
|
-----+---+---+-------+---+----
|
|
|
|
| 1 | 3 | one | 1 | -1
|
|
|
|
| 1 | 3 | one | 2 | 2
|
|
|
|
| 1 | 3 | one | 3 | -3
|
|
|
|
| 1 | 3 | one | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 1 | 3 | one | 5 | -5
|
|
|
|
| 2 | 2 | two | 1 | -1
|
|
|
|
| 2 | 2 | two | 2 | 2
|
|
|
|
| 2 | 2 | two | 3 | -3
|
2000-01-09 04:48:39 +01:00
|
|
|
| 2 | 2 | two | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 2 | 2 | two | 5 | -5
|
|
|
|
| 3 | 1 | three | 1 | -1
|
|
|
|
| 3 | 1 | three | 2 | 2
|
|
|
|
| 3 | 1 | three | 3 | -3
|
2000-01-09 04:48:39 +01:00
|
|
|
| 3 | 1 | three | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 3 | 1 | three | 5 | -5
|
|
|
|
| 4 | 0 | four | 1 | -1
|
|
|
|
| 4 | 0 | four | 2 | 2
|
|
|
|
| 4 | 0 | four | 3 | -3
|
2000-01-09 04:48:39 +01:00
|
|
|
| 4 | 0 | four | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 4 | 0 | four | 5 | -5
|
|
|
|
(20 rows)
|
1999-02-23 08:27:13 +01:00
|
|
|
|
2000-02-15 04:31:33 +01:00
|
|
|
-- ambiguous column
|
2000-01-09 04:48:39 +01:00
|
|
|
SELECT '' AS "xxx", i, k, t
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL CROSS JOIN J2_TBL;
|
2000-09-12 23:07:18 +02:00
|
|
|
ERROR: Column reference "i" is ambiguous
|
2000-02-15 04:31:33 +01:00
|
|
|
-- resolve previous ambiguity by specifying the table name
|
|
|
|
SELECT '' AS "xxx", t1.i, k, t
|
|
|
|
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
|
|
|
|
xxx | i | k | t
|
|
|
|
-----+---+----+-------
|
|
|
|
| 1 | -1 | one
|
|
|
|
| 1 | 2 | one
|
|
|
|
| 1 | -3 | one
|
|
|
|
| 1 | 4 | one
|
2000-09-12 23:07:18 +02:00
|
|
|
| 1 | -5 | one
|
|
|
|
| 2 | -1 | two
|
|
|
|
| 2 | 2 | two
|
|
|
|
| 2 | -3 | two
|
2000-02-15 04:31:33 +01:00
|
|
|
| 2 | 4 | two
|
2000-09-12 23:07:18 +02:00
|
|
|
| 2 | -5 | two
|
|
|
|
| 3 | -1 | three
|
|
|
|
| 3 | 2 | three
|
|
|
|
| 3 | -3 | three
|
2000-02-15 04:31:33 +01:00
|
|
|
| 3 | 4 | three
|
2000-09-12 23:07:18 +02:00
|
|
|
| 3 | -5 | three
|
|
|
|
| 4 | -1 | four
|
|
|
|
| 4 | 2 | four
|
|
|
|
| 4 | -3 | four
|
2000-02-15 04:31:33 +01:00
|
|
|
| 4 | 4 | four
|
2000-09-12 23:07:18 +02:00
|
|
|
| 4 | -5 | four
|
|
|
|
(20 rows)
|
2000-02-15 04:31:33 +01:00
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
SELECT '' AS "xxx", ii, tt, kk
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM (J1_TBL CROSS JOIN J2_TBL)
|
|
|
|
AS tx (ii, jj, tt, ii2, kk);
|
2000-09-12 23:07:18 +02:00
|
|
|
xxx | ii | tt | kk
|
|
|
|
-----+----+-------+----
|
|
|
|
| 1 | one | -1
|
|
|
|
| 1 | one | 2
|
|
|
|
| 1 | one | -3
|
|
|
|
| 1 | one | 4
|
|
|
|
| 1 | one | -5
|
|
|
|
| 2 | two | -1
|
|
|
|
| 2 | two | 2
|
|
|
|
| 2 | two | -3
|
|
|
|
| 2 | two | 4
|
|
|
|
| 2 | two | -5
|
|
|
|
| 3 | three | -1
|
|
|
|
| 3 | three | 2
|
|
|
|
| 3 | three | -3
|
|
|
|
| 3 | three | 4
|
|
|
|
| 3 | three | -5
|
|
|
|
| 4 | four | -1
|
|
|
|
| 4 | four | 2
|
|
|
|
| 4 | four | -3
|
|
|
|
| 4 | four | 4
|
|
|
|
| 4 | four | -5
|
|
|
|
(20 rows)
|
|
|
|
|
2000-02-15 04:31:33 +01:00
|
|
|
SELECT '' AS "xxx", tx.ii, tx.jj, tx.kk
|
|
|
|
FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e))
|
|
|
|
AS tx (ii, jj, tt, ii2, kk);
|
2000-09-12 23:07:18 +02:00
|
|
|
xxx | ii | jj | kk
|
|
|
|
-----+----+----+----
|
|
|
|
| 1 | 3 | -1
|
|
|
|
| 1 | 3 | 2
|
|
|
|
| 1 | 3 | -3
|
|
|
|
| 1 | 3 | 4
|
|
|
|
| 1 | 3 | -5
|
|
|
|
| 2 | 2 | -1
|
|
|
|
| 2 | 2 | 2
|
|
|
|
| 2 | 2 | -3
|
|
|
|
| 2 | 2 | 4
|
|
|
|
| 2 | 2 | -5
|
|
|
|
| 3 | 1 | -1
|
|
|
|
| 3 | 1 | 2
|
|
|
|
| 3 | 1 | -3
|
|
|
|
| 3 | 1 | 4
|
|
|
|
| 3 | 1 | -5
|
|
|
|
| 4 | 0 | -1
|
|
|
|
| 4 | 0 | 2
|
|
|
|
| 4 | 0 | -3
|
|
|
|
| 4 | 0 | 4
|
|
|
|
| 4 | 0 | -5
|
|
|
|
(20 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL CROSS JOIN J2_TBL a CROSS JOIN J2_TBL b;
|
|
|
|
xxx | i | j | t | i | k | i | k
|
|
|
|
-----+---+---+-------+---+----+---+----
|
|
|
|
| 1 | 3 | one | 1 | -1 | 1 | -1
|
|
|
|
| 1 | 3 | one | 1 | -1 | 2 | 2
|
|
|
|
| 1 | 3 | one | 1 | -1 | 3 | -3
|
|
|
|
| 1 | 3 | one | 1 | -1 | 2 | 4
|
|
|
|
| 1 | 3 | one | 1 | -1 | 5 | -5
|
|
|
|
| 1 | 3 | one | 2 | 2 | 1 | -1
|
|
|
|
| 1 | 3 | one | 2 | 2 | 2 | 2
|
|
|
|
| 1 | 3 | one | 2 | 2 | 3 | -3
|
|
|
|
| 1 | 3 | one | 2 | 2 | 2 | 4
|
|
|
|
| 1 | 3 | one | 2 | 2 | 5 | -5
|
|
|
|
| 1 | 3 | one | 3 | -3 | 1 | -1
|
|
|
|
| 1 | 3 | one | 3 | -3 | 2 | 2
|
|
|
|
| 1 | 3 | one | 3 | -3 | 3 | -3
|
|
|
|
| 1 | 3 | one | 3 | -3 | 2 | 4
|
|
|
|
| 1 | 3 | one | 3 | -3 | 5 | -5
|
|
|
|
| 1 | 3 | one | 2 | 4 | 1 | -1
|
|
|
|
| 1 | 3 | one | 2 | 4 | 2 | 2
|
|
|
|
| 1 | 3 | one | 2 | 4 | 3 | -3
|
|
|
|
| 1 | 3 | one | 2 | 4 | 2 | 4
|
|
|
|
| 1 | 3 | one | 2 | 4 | 5 | -5
|
|
|
|
| 1 | 3 | one | 5 | -5 | 1 | -1
|
|
|
|
| 1 | 3 | one | 5 | -5 | 2 | 2
|
|
|
|
| 1 | 3 | one | 5 | -5 | 3 | -3
|
|
|
|
| 1 | 3 | one | 5 | -5 | 2 | 4
|
|
|
|
| 1 | 3 | one | 5 | -5 | 5 | -5
|
|
|
|
| 2 | 2 | two | 1 | -1 | 1 | -1
|
|
|
|
| 2 | 2 | two | 1 | -1 | 2 | 2
|
|
|
|
| 2 | 2 | two | 1 | -1 | 3 | -3
|
|
|
|
| 2 | 2 | two | 1 | -1 | 2 | 4
|
|
|
|
| 2 | 2 | two | 1 | -1 | 5 | -5
|
|
|
|
| 2 | 2 | two | 2 | 2 | 1 | -1
|
|
|
|
| 2 | 2 | two | 2 | 2 | 2 | 2
|
|
|
|
| 2 | 2 | two | 2 | 2 | 3 | -3
|
|
|
|
| 2 | 2 | two | 2 | 2 | 2 | 4
|
|
|
|
| 2 | 2 | two | 2 | 2 | 5 | -5
|
|
|
|
| 2 | 2 | two | 3 | -3 | 1 | -1
|
|
|
|
| 2 | 2 | two | 3 | -3 | 2 | 2
|
|
|
|
| 2 | 2 | two | 3 | -3 | 3 | -3
|
|
|
|
| 2 | 2 | two | 3 | -3 | 2 | 4
|
|
|
|
| 2 | 2 | two | 3 | -3 | 5 | -5
|
|
|
|
| 2 | 2 | two | 2 | 4 | 1 | -1
|
|
|
|
| 2 | 2 | two | 2 | 4 | 2 | 2
|
|
|
|
| 2 | 2 | two | 2 | 4 | 3 | -3
|
|
|
|
| 2 | 2 | two | 2 | 4 | 2 | 4
|
|
|
|
| 2 | 2 | two | 2 | 4 | 5 | -5
|
|
|
|
| 2 | 2 | two | 5 | -5 | 1 | -1
|
|
|
|
| 2 | 2 | two | 5 | -5 | 2 | 2
|
|
|
|
| 2 | 2 | two | 5 | -5 | 3 | -3
|
|
|
|
| 2 | 2 | two | 5 | -5 | 2 | 4
|
|
|
|
| 2 | 2 | two | 5 | -5 | 5 | -5
|
|
|
|
| 3 | 1 | three | 1 | -1 | 1 | -1
|
|
|
|
| 3 | 1 | three | 1 | -1 | 2 | 2
|
|
|
|
| 3 | 1 | three | 1 | -1 | 3 | -3
|
|
|
|
| 3 | 1 | three | 1 | -1 | 2 | 4
|
|
|
|
| 3 | 1 | three | 1 | -1 | 5 | -5
|
|
|
|
| 3 | 1 | three | 2 | 2 | 1 | -1
|
|
|
|
| 3 | 1 | three | 2 | 2 | 2 | 2
|
|
|
|
| 3 | 1 | three | 2 | 2 | 3 | -3
|
|
|
|
| 3 | 1 | three | 2 | 2 | 2 | 4
|
|
|
|
| 3 | 1 | three | 2 | 2 | 5 | -5
|
|
|
|
| 3 | 1 | three | 3 | -3 | 1 | -1
|
|
|
|
| 3 | 1 | three | 3 | -3 | 2 | 2
|
|
|
|
| 3 | 1 | three | 3 | -3 | 3 | -3
|
|
|
|
| 3 | 1 | three | 3 | -3 | 2 | 4
|
|
|
|
| 3 | 1 | three | 3 | -3 | 5 | -5
|
|
|
|
| 3 | 1 | three | 2 | 4 | 1 | -1
|
|
|
|
| 3 | 1 | three | 2 | 4 | 2 | 2
|
|
|
|
| 3 | 1 | three | 2 | 4 | 3 | -3
|
|
|
|
| 3 | 1 | three | 2 | 4 | 2 | 4
|
|
|
|
| 3 | 1 | three | 2 | 4 | 5 | -5
|
|
|
|
| 3 | 1 | three | 5 | -5 | 1 | -1
|
|
|
|
| 3 | 1 | three | 5 | -5 | 2 | 2
|
|
|
|
| 3 | 1 | three | 5 | -5 | 3 | -3
|
|
|
|
| 3 | 1 | three | 5 | -5 | 2 | 4
|
|
|
|
| 3 | 1 | three | 5 | -5 | 5 | -5
|
|
|
|
| 4 | 0 | four | 1 | -1 | 1 | -1
|
|
|
|
| 4 | 0 | four | 1 | -1 | 2 | 2
|
|
|
|
| 4 | 0 | four | 1 | -1 | 3 | -3
|
|
|
|
| 4 | 0 | four | 1 | -1 | 2 | 4
|
|
|
|
| 4 | 0 | four | 1 | -1 | 5 | -5
|
|
|
|
| 4 | 0 | four | 2 | 2 | 1 | -1
|
|
|
|
| 4 | 0 | four | 2 | 2 | 2 | 2
|
|
|
|
| 4 | 0 | four | 2 | 2 | 3 | -3
|
|
|
|
| 4 | 0 | four | 2 | 2 | 2 | 4
|
|
|
|
| 4 | 0 | four | 2 | 2 | 5 | -5
|
|
|
|
| 4 | 0 | four | 3 | -3 | 1 | -1
|
|
|
|
| 4 | 0 | four | 3 | -3 | 2 | 2
|
|
|
|
| 4 | 0 | four | 3 | -3 | 3 | -3
|
|
|
|
| 4 | 0 | four | 3 | -3 | 2 | 4
|
|
|
|
| 4 | 0 | four | 3 | -3 | 5 | -5
|
|
|
|
| 4 | 0 | four | 2 | 4 | 1 | -1
|
|
|
|
| 4 | 0 | four | 2 | 4 | 2 | 2
|
|
|
|
| 4 | 0 | four | 2 | 4 | 3 | -3
|
|
|
|
| 4 | 0 | four | 2 | 4 | 2 | 4
|
|
|
|
| 4 | 0 | four | 2 | 4 | 5 | -5
|
|
|
|
| 4 | 0 | four | 5 | -5 | 1 | -1
|
|
|
|
| 4 | 0 | four | 5 | -5 | 2 | 2
|
|
|
|
| 4 | 0 | four | 5 | -5 | 3 | -3
|
|
|
|
| 4 | 0 | four | 5 | -5 | 2 | 4
|
|
|
|
| 4 | 0 | four | 5 | -5 | 5 | -5
|
|
|
|
(100 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
--
|
|
|
|
-- Inner joins (equi-joins)
|
|
|
|
--
|
|
|
|
--
|
|
|
|
--
|
|
|
|
-- Inner joins (equi-joins) with USING clause
|
|
|
|
-- The USING syntax changes the shape of the resulting table
|
|
|
|
-- by including a column in the USING clause only once in the result.
|
|
|
|
--
|
|
|
|
-- Inner equi-join on specified column
|
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL INNER JOIN J2_TBL USING (i);
|
|
|
|
xxx | i | j | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
(4 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
-- Same as above, slightly different syntax
|
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL JOIN J2_TBL USING (i);
|
|
|
|
xxx | i | j | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a);
|
|
|
|
xxx | a | b | c | d
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b);
|
|
|
|
xxx | b | a | c | a
|
|
|
|
-----+---+---+-----+---
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
--
|
|
|
|
-- NATURAL JOIN
|
|
|
|
-- Inner equi-join on all columns with the same name
|
|
|
|
--
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL NATURAL JOIN J2_TBL;
|
|
|
|
xxx | i | j | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
|
|
|
|
xxx | a | b | c | d
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
|
|
|
|
xxx | a | b | c | d
|
|
|
|
-----+---+---+------+---
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 4 | 0 | four | 2
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
-- mismatch number of columns
|
|
|
|
-- currently, Postgres will fill in with underlying names
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
|
|
|
|
xxx | a | b | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
(4 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- Inner joins (equi-joins)
|
|
|
|
--
|
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
|
2000-05-12 03:33:56 +02:00
|
|
|
xxx | i | j | t | i | k
|
|
|
|
-----+---+---+-------+---+----
|
|
|
|
| 1 | 3 | one | 1 | -1
|
|
|
|
| 2 | 2 | two | 2 | 2
|
|
|
|
| 2 | 2 | two | 2 | 4
|
|
|
|
| 3 | 1 | three | 3 | -3
|
|
|
|
(4 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
|
2000-05-12 03:33:56 +02:00
|
|
|
xxx | i | j | t | i | k
|
|
|
|
-----+---+---+------+---+---
|
|
|
|
| 2 | 2 | two | 2 | 2
|
|
|
|
| 4 | 0 | four | 2 | 4
|
|
|
|
(2 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- Non-equi-joins
|
|
|
|
--
|
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
|
2000-05-12 03:33:56 +02:00
|
|
|
xxx | i | j | t | i | k
|
|
|
|
-----+---+---+-------+---+---
|
|
|
|
| 1 | 3 | one | 2 | 2
|
|
|
|
| 1 | 3 | one | 2 | 4
|
2000-09-12 23:07:18 +02:00
|
|
|
| 2 | 2 | two | 2 | 2
|
2000-05-12 03:33:56 +02:00
|
|
|
| 2 | 2 | two | 2 | 4
|
|
|
|
| 3 | 1 | three | 2 | 4
|
|
|
|
| 4 | 0 | four | 2 | 4
|
|
|
|
(6 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- Outer joins
|
|
|
|
--
|
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i);
|
2000-09-12 23:07:18 +02:00
|
|
|
xxx | i | j | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
| 4 | 0 | four |
|
|
|
|
(5 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
SELECT '' AS "xxx", *
|
2000-02-15 04:31:33 +01:00
|
|
|
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
|
2000-09-12 23:07:18 +02:00
|
|
|
xxx | i | j | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
| 5 | | | -5
|
|
|
|
(5 rows)
|
|
|
|
|
|
|
|
-- Note that OUTER is a noise word
|
2000-01-09 04:48:39 +01:00
|
|
|
SELECT '' AS "xxx", *
|
2000-09-12 23:07:18 +02:00
|
|
|
FROM J1_TBL FULL JOIN J2_TBL USING (i);
|
|
|
|
xxx | i | j | t | k
|
|
|
|
-----+---+---+-------+----
|
|
|
|
| 1 | 3 | one | -1
|
|
|
|
| 2 | 2 | two | 2
|
|
|
|
| 2 | 2 | two | 4
|
|
|
|
| 3 | 1 | three | -3
|
|
|
|
| 4 | 0 | four |
|
|
|
|
| 5 | | | -5
|
|
|
|
(6 rows)
|
|
|
|
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- More complicated constructs
|
|
|
|
--
|
2000-09-12 23:07:18 +02:00
|
|
|
-- UNION JOIN isn't implemented yet
|
|
|
|
SELECT '' AS "xxx", *
|
|
|
|
FROM J1_TBL UNION JOIN J2_TBL;
|
|
|
|
ERROR: UNION JOIN is not implemented yet
|
2000-01-09 04:48:39 +01:00
|
|
|
--
|
|
|
|
-- Clean up
|
|
|
|
--
|
2000-02-15 04:31:33 +01:00
|
|
|
DROP TABLE J1_TBL;
|
|
|
|
DROP TABLE J2_TBL;
|