Как сделать левое соединение с `where second_table.key! = 'Value'`, если в secord_table вообще нет записи - PullRequest
0 голосов
/ 31 марта 2020

Есть две таблицы с отношением один к одному, и законно, что вторая таблица может иметь меньше строк, чем первая.

Вот код sql со вставленными данными:

create table data(
    data_id int primary key,
    name text
);

create table data_extra(
    extra_id int references data(data_id) primary key ,
    extra text
);

insert into data values (1, 'n1');
insert into data values (2, 'n2');
insert into data values (3, 'n3');

insert into data_extra values (1, 'e1');
insert into data_extra values (2, 'e2');


select * from data left join data_extra on data_id = extra_id;
--  data_id | name | extra_id | extra
-- ---------+------+----------+-------
--        1 | n1   |        1 | e1
--        2 | n2   |        2 | e2
--        3 | n3   |          |
-- (3 rows)

Мне нужно сделать запрос для всех data + data_extra таблиц, где дополнительные! = 'E1' Вот моя попытка:

select * from data left join data_extra on data_id = extra_id
where extra != 'e1';
--  data_id | name | extra_id | extra
-- ---------+------+----------+-------
--        2 | n2   |        2 | e2
-- (1 row)

Проблема с этим запросом, что он не возвращает data.name = 'n3' строку, у которой нет связанной строки в таблице data_extra.

Как это исправить, чтобы получить в результате data.name = n2 и данные .name = n3.

1 Ответ

1 голос
/ 31 марта 2020

Вы можете сделать:

select * 
from data d
left join data_extra de on d.data_id = de.extra_id 
where de.extra_id is null or de.extra <> 'e1'

Это удаляет строки, которые совпадают и чьи extra равна 'e1', при этом сохраняя несовпадающие строки.

...