Найти строки в A, у которых нет связанной строки в B, где FK находится на B? - PullRequest
4 голосов
/ 31 мая 2011

То, что я делал, это

SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL

Обычно я пытаюсь найти строки a, которые не имеют b, где внешний ключ хранится в b. Это правильный способ сделать это, или есть другой тип соединения, чтобы сделать это?

Ответы [ 4 ]

7 голосов
/ 31 мая 2011

Вы ищете NOT EXISTS:

SELECT 
  * 
FROM 
  a
WHERE
  NOT EXISTS (SELECT 1 FROM b WHERE a_id = a.id)

Наличие индекса на b.a_id помогает выполнить этот запрос.

5 голосов
/ 31 мая 2011

да, это нормальный путь, лучшего способа я не знаю.

2 голосов
/ 31 мая 2011

Вы можете попробовать

Select * from a where a.id not in (Select a_id from b)
1 голос
/ 31 мая 2011

Три предыдущих ответа верны, на данный момент, я думаю, вы можете оценить производительность трех видов запросов. Вы можете посмотреть на этот URL:

http://rockycode.com/blog/not-vs-outer-join-performance/

По моему мнению, наилучшим способом является внешнее объединение, и, если у вас не слишком много строк, три пути более или менее равны.

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