PostgreSQL | CROSS JOIN для двух таблиц

PostgreSQL | CROSS JOIN для двух таблиц

Предложение «CROSS JOIN» представляет собой обычное перемножение записей из двух разных таблиц. Каждый результат перемножения — это отдельная запись в новой результирующей таблице. Количество столбцов увеличивается.

Есть две таблицы:

-- Таблица № 1
create table test.t01 (
   id int,
   name text,
   primary key(id)
);
insert into test.t01 values (1, 'A');
insert into test.t01 values (2, 'B');
insert into test.t01 values (3, 'C');
SELECT * FROM test.t01;

-- Таблица № 2
create table test.t02 (
   id int,
   name text,
   primary key(id)
);
insert into test.t02 values (1, 'xxx');
insert into test.t02 values (3, 'yyy');
insert into test.t02 values (5, 'zzz');
SELECT * FROM test.t02;

Обратите внимание, что у второй таблицы первичные ключи идут не последовательно. Типы данных повторяются, чтобы было проще понять.

Каждая таблица содержит по три записи.

table test.t01 для соединения в PostgreSQL
table test.t01 для соединения в PostgreSQL
table test.t02 для соединения в PostgreSQL
table test.t02 для соединения в PostgreSQL

То есть при простом перемножении через CROSS JOIN мы получим 9 записей в новой таблице (в новом результате соединения) и 4 столбца.

SELECT * FROM test.t01 CROSS JOIN test.t02;
CROSS JOIN двух таблиц в PostgreSQL
CROSS JOIN двух таблиц в PostgreSQL

Здесь важно, что сначала перебираются записи первой таблицы, а затем перебираются записи второй. Расположение таблиц относительно предложения «CROSS JOIN» влияет на итоговый результат.

SELECT * FROM test.t02 CROSS JOIN test.t01;
CROSS JOIN двух таблиц в PostgreSQL - положение таблиц заменены
CROSS JOIN двух таблиц в PostgreSQL — положение таблиц заменены

В результирующем варианте таблицы мы получаем 4 столбца, в которых повторяются пары имён столбцов.

 

Другие способы получения подобного соединения

Выражение «INNER JOIN ON (true)»

SELECT * FROM test.t01 INNER JOIN test.t02 ON (true);
INNER JOIN ON TRUE для двух таблиц в PostgreSQL
INNER JOIN ON TRUE для двух таблиц в PostgreSQL

 

Выражение «FULL JOIN ON (true)»

SELECT * FROM test.t01 FULL JOIN test.t02 ON (true);
FULL JOIN ON TRUE для двух таблиц в PostgreSQL
FULL JOIN ON TRUE для двух таблиц в PostgreSQL

 

Выражение «LEFT JOIN ON (true)»

SELECT * FROM test.t01 LEFT JOIN test.t02 ON (true);
LEFT JOIN ON TRUE для двух таблиц в PostgreSQL
LEFT JOIN ON TRUE для двух таблиц в PostgreSQL

 

Выражение «RIGHT JOIN ON (true)»

SELECT * FROM test.t01 RIGHT JOIN test.t02 ON (true);
RIGHT JOIN ON TRUE для двух таблиц в PostgreSQL
RIGHT JOIN ON TRUE для двух таблиц в PostgreSQL