2009-08-21 14 views
11

Tengo una tabla de equipos y una mesa de jugadores y quiero encontrar todos los equipos que no tienen jugadores asociados con ellos. La tabla de jugadores está asociada a través de una columna team_id. Estoy usando Ruby on Rails para esto, así que tengo un modelo Team y Player.Encontrar todos los registros sin asociados

+0

Qué dialecto de SQL está utilizando? –

+0

Idealmente esto debería funcionar con MySQL, Postgres y Sqlite3 –

Respuesta

15

Se puede realizar mejor haciendo una combinación izquierda:

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

o el uso de Arel (gracias a la observación del JasonKing):

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

Perfecto, y estoy usando Rails también (algo que debería haber mencionado, Supongo) entonces esto se relaciona muy bien con la sintaxis de: join y: conditions. –

+3

No es necesario usar SQL para la unión, eso es lo que 'includes()' hace. Es decir. 'Team.includes (: players) .where ('players.team_id IS NULL')' – smathy

+3

Una última fineza: 'Team.includes (: players) .where (: players => {: team_id => nil})' – smathy

4

Algo como esto:

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

La desventaja de este enfoque: va a llevar un tiempo si tienes muchos registros de jugadores –

0

que lo hicieras con una condición NOT EXISTS así:

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

En general, debería ser capaz de hacer una combinación externa de padres a hijos y de verificación para un valor nulo en un campo en el niño que no es nula. Esto es generalmente más rápido que un "no en" o "no existe". Esto puede no funcionar en todas las bases de datos.

Cuestiones relacionadas