Подтвердить что ты не робот

Как найти записи, которые не объединены?

У меня есть две таблицы, которые соединены вместе.

A имеет много B

Обычно вы делаете:

select * from a,b where b.a_id = a.id

Чтобы получить все записи из файла с записью в b.

Как получить только записи в файле, который ничего не имеет в b?

4b9b3361

Ответ 1

select * from a where id not in (select a_id from b)

Или, как некоторые другие люди в этой теме говорят:

select a.* from a
left outer join b on a.id = b.a_id
where b.a_id is null

Ответ 2

select * from a
left outer join b on a.id = b.a_id
where b.a_id is null

Ответ 3

Другой подход:

select * from a where not exists (select * from b where b.a_id = a.id)

Подход "существует" полезен, если есть какое-то другое предложение "where", которое вам нужно прикрепить к внутреннему запросу.

Ответ 4

SELECT id FROM a
EXCEPT
SELECT a_id FROM b;

Ответ 5

SELECT <columnns>
FROM a WHERE id NOT IN (SELECT a_id FROM b)

Ответ 6

Вероятно, вы получите гораздо лучшую производительность (чем использование "не в" ), если вы используете внешнее соединение:

select * from a left outer join b on a.id = b.a_id where b.a_id is null;

Ответ 7

Еще один способ написать это

select a.*
from a 
left outer join b
on a.id = b.id
where b.id is null

Ой, избит Натаном :)

Ответ 8

Это защитит вас от нулей в предложении IN, что может привести к неожиданному поведению.

выберите * из идентификатора, где не находится (выберите [a id] из b, где [id] не является нулевым)

Ответ 9

В случае одного соединения это довольно быстро, но когда мы удаляем записи из базы данных, содержащей около 50 миллионов записей и 4 и более соединений из-за внешних ключей, для этого требуется несколько минут. Гораздо быстрее использовать условие WHERE NOT IN следующим образом:

select a.* from a
where a.id NOT IN(SELECT DISTINCT a_id FROM b where a_id IS NOT NULL)
//And for more joins
AND a.id NOT IN(SELECT DISTINCT a_id FROM c where a_id IS NOT NULL)

Я также могу рекомендовать этот подход для удаления, если мы не настроили каскадное удаление. Этот запрос занимает всего несколько секунд.

Ответ 10

Первый подход

select a.* from a where a.id  not in (select b.ida from b)

второй подход

select a.*
  from a left outer join b on a.id = b.ida
  where b.ida is null

Первый подход очень дорог. Второй подход лучше.

С PostgreSql 9.4 я выполнил функцию "объяснение запроса" и первый запрос как стоимость стоимости = 0,00..1982043603.32. Вместо этого запрос соединения как стоимость стоимости = 45946.77..45946.78

Например, я ищу все продукты, которые не совместимы без транспортных средств. У меня есть 100 тыс. Продуктов и более 1 м совместимости.

select count(*) from product a left outer join compatible c on a.id=c.idprod where c.idprod is null

Запрос на соединение длился около 5 секунд, вместо этого версия подзапроса никогда не заканчивалась через 3 минуты.