SQL: выбрать несопоставимые записи из 2 таблиц - PullRequest
4 голосов
/ 25 февраля 2020

У меня есть 2 таблицы, и я хочу получить строки из первой таблицы, где id_apartment не отображается во второй таблице:

id | id_floor | id_apartment 
----+----------+--------------
  1 |        0 |          101
  2 |        1 |          101
  3 |        1 |          102
  4 |        1 |          103
  5 |        1 |          104
  6 |        2 |          201
  7 |        2 |          202
  8 |        2 |          203


table2.id | table2.guest | table2.apartment_id
----+---------------+--------------
  1 |         65652 |          101
  2 |         65653 |          101
  3 |         65654 |          101
  4 |         65655 |          101
  5 |         65659 |          102
  6 |         65656 |          201
  7 |         65660 |          202
  8 |         65661 |          202
  9 |         65662 |          202
 10 |         65663 |          203

ожидаемый результат:

floor | number
-------+--------
     1 |    103
     1 |    104

Я пытался использовать LEFT, INNER и RIGHT join, но я всегда получаю ПУСТОЙ результат. Как я могу справиться с этим?

Ответы [ 5 ]

3 голосов
/ 25 февраля 2020

Вы можете использовать not exists:

select *
from table1 t1
where not exists(
    select 1
    from table2 t2
    where t1.id_apartment = t2.apartment_id
)
1 голос
/ 25 февраля 2020

Каноническим решением является not exists:

select t1.*
from table1 t1
where not exists (select 1 from table2 t2 where t2.apartment_id = t1.id_apatment);

Однако это также вернет значение 1 в первой таблице, а также 103 и 104.

Я не знаю, хотите ли вы дополнительную фильтрацию на floor или данные в вопросе неверны.

0 голосов
/ 25 февраля 2020

Давайте имя первых таблиц будет table1 , а имя вторых * table2 .

Ответ вашего вопроса:

select * from table1 t1 
where t1.id_apartment <> all (select t2.apartment_id from table2 t2 )
0 голосов
/ 25 февраля 2020

Вы можете использовать левое анти-объединение здесь:

SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2
    ON t1.id_apartment = t2.apartment_id
WHERE
    t2.apartment_id IS NULL;

Но существующие логики c должны работать так же хорошо, и на самом деле будут ближе к буквальному переводу вашего требования.

0 голосов
/ 25 февраля 2020

Одним из быстрых решений было бы использование not in

Select * from table_1 where table_1.id_apartment not in (select apartment_id from table_2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...