2009-08-21 5 views
11

У меня есть таблица команд и таблица игроков, и я хочу найти все команды, у которых нет игроков, связанных с ними. Таблица игроков ассоциируется с помощью столбца team_id. Я использую Ruby on Rails для этого, поэтому у меня есть Team и Player.Поиск всех записей без связанных с ними

+0

Какой диалект SQL вы используете? –

+0

В идеале это должно работать с MySQL, Postgres и Sqlite3 –

ответ

15

Он может работать лучше делать левое соединение:

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') 
+0

Отлично, и я тоже использую Rails (что-то, о чем я должен был упомянуть, Я думаю), так что это прекрасно связывается с синтаксисом: join и: conditions. –

+3

Не нужно использовать SQL для соединения, это то, что 'includes()' делает. То есть. 'Team.includes (: players) .where ('players.team_id IS NULL')' – smathy

+3

Последняя утонченность: 'Team.includes (: players) .where (: players => {: team_id => nil})' – smathy

4

Что-то вроде этого:

select * from teams 
where id not in (select distinct team_id from players) 
+0

Недостаток с таким подходом: займет некоторое время, если у вас много записей игроков –

0

Вы бы сделать это с NOT EXISTS условием, как так:

SELECT * 
FROM teams 
WHERE NOT EXISTS (SELECT 1 FROM players WHERE players.team_id = teams.team_id) 
1

Вы должны вообще быть в состоянии сделать внешнее соединение от родителя к ребенку и проверки для нулевого значения в поле в дочернем элементе, который не имеет нулевого значения. Это обычно быстрее, чем «не в» или «не существует». Это может не работать во всех базах данных.

Смежные вопросы