13 Stimmen

Suche nach allen Datensätzen ohne zugehörige Datensätze

Ich habe eine Tabelle mit Mannschaften und eine Tabelle mit Spielern und möchte alle Mannschaften finden, denen keine Spieler zugeordnet sind. Die Spielertabelle ist über eine team_id Spalte. Ich verwende Ruby on Rails für diese, so dass ich ein Team und ein Spieler-Modell haben.

0 Stimmen

Welchen SQL-Dialekt verwenden Sie?

0 Stimmen

Idealerweise sollte dies mit MySQL, Postgres und Sqlite3 funktionieren.

19voto

Richard Pistole Punkte 596

Möglicherweise ist es besser, eine linke Verbindung herzustellen:

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

Oder mit ARel (dank des Kommentars von JasonKing):

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

0 Stimmen

Perfekt, und ich benutze auch Rails (was ich wohl hätte erwähnen sollen), so dass dies gut mit der :joins und :conditions Syntax zusammenpasst.

3 Stimmen

Für die Verknüpfung brauchen Sie kein SQL zu verwenden, das ist includes() tut. D. h. Team.includes(:players).where('players.team_id IS NULL')

3 Stimmen

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

4voto

Simon Nickerson Punkte 40349

Etwa so:

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

0 Stimmen

Der Nachteil dieses Ansatzes ist, dass es eine Weile dauern wird, wenn Sie viele Datensätze haben.

2voto

VoteyDisciple Punkte 36203

Sie würden das mit einer NOT EXISTS Bedingung wie folgt:

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

1voto

Nerdfest Punkte 1675

Sie sollten in der Regel in der Lage sein, eine äußere Verknüpfung von übergeordneter zu untergeordneter Datei durchzuführen und auf einen Nullwert in einem Feld in der untergeordneten Datei zu prüfen, das nicht nullbar ist. Dies ist im Allgemeinen schneller als ein "not in" oder "not exists". Dies funktioniert möglicherweise nicht bei allen Datenbanken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X