2009-08-21 10 views
11

Mam stół drużynowy i stół graczy i chcę znaleźć wszystkie drużyny, które nie mają powiązanych z nimi graczy. Tabela graczy jest powiązana z kolumną team_id. Używam Ruby on Rails, więc mam model Team i Player.Wyszukiwanie wszystkich rekordów bez powiązanych z nimi

+0

Które dialekt SQL używasz? –

+0

Idealnie powinno to działać z MySQL, Postgresem i Sqlite3. –

Odpowiedz

15

może działać lepiej robi LEFT JOIN:

SELECT 
teams.* 
FROM teams 
LEFT JOIN players ON (teams.id = players.team_id) 
WHERE 
players.team_id IS NULL 

lub korzystając AREL (dzięki za komentarz JasonKing):

Team.includes(:players).where('players.team_id IS NULL') 
+0

Idealne, i używam także Railsów (coś, co powinienem wspomnieć, Zgaduję) więc to ładnie wiąże się ze składnią: join i: conditions. –

+3

Nie ma potrzeby używania SQL do łączenia, to właśnie robi 'includes()'. To znaczy. 'Team.includes (: players) .where (" players.team_id IS NULL ")' – smathy

+3

Ostatnia finezja: 'Team.includes (: players) .where (: players => {: team_id => zero})' – smathy

4

coś takiego:

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

Minusem tego podejścia: zajmie trochę czasu, jeśli masz dużo rekordów graczy –

0

Można by zrobić z NOT EXISTS stanie tak:

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

powinien generalnie móc zrobić sprzężenie zewnętrzne z rodzica na dziecko i sprawdzenie dla wartości pustej w polu w elemencie potomnym, które nie ma wartości NULL. Jest to na ogół szybsze niż "nie w" lub "nie istnieje". To może nie działać we wszystkich bazach danych.

Powiązane problemy