У меня есть таблица команд и таблица игроков, и я хочу найти все команды, у которых нет игроков, связанных с ними. Таблица игроков ассоциируется с помощью столбца team_id
. Я использую Ruby on Rails для этого, поэтому у меня есть Team и Player.
Поиск всех записей без связанных с ними
Ответ 1
Он может лучше выполнять левое соединение:
SELECT
teams.*
FROM teams
LEFT JOIN players ON (teams.id = players.team_id)
WHERE
players.team_id IS NULL
Или используя ARel (спасибо комментарию JasonKing):
Team.includes(:players).where('players.team_id IS NULL')
Ответ 2
Что-то вроде этого:
select * from teams
where id not in (select distinct team_id from players)
Ответ 3
Как правило, вы можете выполнять внешнее соединение от родителя к дочернему элементу и проверять нулевое значение в поле дочернего элемента, которое не имеет нулевого значения. Это обычно быстрее, чем "не в" или "не существует". Это может не работать во всех базах данных.
Ответ 4
Вы сделали бы это с условием NOT EXISTS
следующим образом:
SELECT *
FROM teams
WHERE NOT EXISTS (SELECT 1 FROM players WHERE players.team_id = teams.team_id)