2009-08-21 11 views
11

Ich habe eine Team-Tabelle und eine Spieler-Tabelle und ich möchte alle Teams finden, die keine Spieler mit ihnen verbunden haben. Die Spielertabelle ist über eine Spalte team_id verbunden. Ich benutze Ruby on Rails dafür, also habe ich ein Team- und ein Player-Modell.Suche nach allen Datensätzen ohne zugehörige

+0

Welche SQL-Dialekt spielst Du? –

+0

Idealerweise sollte dies mit MySQL, Postgres und Sqlite3 funktionieren. –

Antwort

15

Es kann eine bessere Leistung nach links zu tun kommen:

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

Oder mit Arel (dank JasonKing Kommentar):

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

Perfekt, und ich verwende auch Rails (etwas, das ich hätte erwähnen sollen, Ich schätze, das passt gut zur Syntax von: joins und: conditions. –

+3

Keine Notwendigkeit, SQL für den Join zu verwenden, das ist es, was 'includes()' tut. Ie. 'Team.includes (: players) .where ('players.team_id IS NULL')' – smathy

+3

Eine letzte Finesse: 'Team.includes (: players) .where (: players => {: team_id => nil})' – smathy

4

Etwas wie folgt aus:

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

Der Nachteil bei diesem Ansatz: Es wird eine Weile dauern, wenn Sie viele Spieler Datensätze haben –

0

Sie würden das tun, mit einem NOT EXISTS Zustand etwa so:

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

Sie sollten von Eltern auf das Kind und die Prüfung generell in der Lage sein, kommen Sie mit einem Außen zu tun für einen Nullwert in einem Feld in dem untergeordneten Element, das nicht nullfähig ist. Dies ist im Allgemeinen schneller als ein "nicht in" oder "nicht vorhanden". Dies funktioniert möglicherweise nicht in allen Datenbanken.

Verwandte Themen