Объединение результатов из 3 таблиц - PullRequest
0 голосов
/ 08 сентября 2018

Я использую Postgres 10 со следующей структурой и данными:

create table table1(
  id serial primary key
);

create table table2(
  id serial primary key
);

create table table3(
  id serial primary key,
  table1_id int,
  table2_id int
);

insert into table1 (id) values (1), (2), (3);
insert into table2 (id) values (1), (2);
insert into table3 (id, table1_id, table2_id) values (1, 1, 1), (2, 1, 2), (3, 2, 1);

Я хочу, чтобы все комбинации таблиц table1 и table2 не имели записи в таблице table3, по сути, такой результат:

+-----------+-----------+-----------+
| table1.id | table2.id | table3.id |
+-----------+-----------+-----------+
|         1 |         1 | 1         |
|         2 |         1 | 3         |
|         3 |         1 | null      |
|         1 |         2 | 2         |
|         2 |         2 | null      |
|         3 |         2 | null      |
+-----------+-----------+-----------+

Обратите внимание, что в результатах есть все возможные комбинации из таблицы1 и таблицы2 с соответствующим идентификатором из таблицы3.

В конце концов, я бы хотел, чтобы запрос возвращал только те строки, в которых table3.id равен NULL:

+-----------+-----------+-----------+
| table1.id | table2.id | table3.id |
+-----------+-----------+-----------+
|         3 |         1 | null      |
|         2 |         2 | null      |
|         3 |         2 | null      |
+-----------+-----------+-----------+

Я не уверен, как вообще подойти к этому запросу: присоединиться или Внутренний выбор или, может быть, даже исключает ?

1 Ответ

0 голосов
/ 08 сентября 2018

Вы можете попробовать использовать CROSS JOIN (декартово произведение) на table1 и table2, затем table3 LEFT JOIN на основе CROSS JOIN набора результатов.

Схема (PostgreSQL v9.6)

create table table1(
  id serial primary key
);

create table table2(
  id serial primary key
);

create table table3(
  id serial primary key,
  table1_id int,
  table2_id int
);

insert into table1 (id) values (1), (2), (3);
insert into table2 (id) values (1), (2);
insert into table3 (id, table1_id, table2_id) values (1, 1, 1), (2, 1, 2), (3, 2, 1);

Запрос № 1

SELECT t1.id,t2.id,t3.id 
FROM table1 t1 CROSS JOIN table2 t2
LEFT JOIN table3 t3 
on t3.table1_id = t1.id and t3.table2_id = t2.id
where t3.id is null;

Результат

t1id  t2id  t3id
2      2    null
3      1    null
3      2    null

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...