PostgreSQL | CROSS JOIN для трёх таблиц

PostgreSQL | CROSS JOIN для трёх таблиц

Одно предложение «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;

-- Таблица № 3
create table test.t03 (
id int,
value text,
primary key (id)
);
insert into test.t03 values (1, 'qa');
insert into test.t03 values (2, 'ws');
insert into test.t03 values (4, 'ed');
SELECT * FROM test.t03;

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

Каждая таблица содержит по три записи. Значит в итоговом результате должно появиться 27 записей. Давайте смотреть на скриншот:

SELECT * FROM test.t01 CROSS JOIN test.t02 CROSS JOIN test.t03;
CROSS JOIN трёх таблиц в PostgreSQL
CROSS JOIN трёх таблиц в PostgreSQL

Перемножение записей осуществляется последовательно в порядке появления записей в таблицах.

Сначала мы берём первую запись из первой таблицы, первую запись из второй таблицы и первую запись из третьей таблицы.

Первая запись после CROSS JOIN для трёх таблиц в PosgtreSQL
Первая запись после CROSS JOIN для трёх таблиц в PosgtreSQL

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

Если сравнивать это поведение с каким-либо обычным языком программирования, то это похоже на 3 вложенных цикла.