2010-04-03 13 views
12

Tengo una relación sencilla de uno a muchos. Me gustaría seleccionar filas del padre solo cuando tienen al menos un hijo. Entonces, si no hay hijos, entonces la fila principal no se devuelve en el conjunto de resultados.¿Cómo seleccionar la fila padre solo si tiene al menos un hijo?

Por ejemplo.

Parent: 
+--+---------+ 
|id| text | 
+--+---------+ 
| 1| Blah | 
| 2| Blah2 | 
| 3| Blah3 | 
+--+---------+ 

Children 
+--+------+-------+ 
|id|parent| other | 
+--+------+-------+ 
| 1| 1 | blah | 
| 2| 1 | blah2 | 
| 3| 2 | blah3 | 
+--+------+-------+ 

Quiero que los resultados sean:

+----+------+ 
|p.id|p.text| 
+----+------+ 
| 1 | Blah | 
| 2 | Blah2| 
+----+------+ 

Respuesta

15

Usted puede hacer esto utilizando un EXISTS, así:

SELECT * 
FROM Parent p 
WHERE EXISTS (SELECT 1 
       FROM Chilren c 
       WHERE c.Parent = p.id) 

o utilizando un IN así:

SELECT * 
FROM Parent p 
WHERE p.id IN (SELECT c.Parent 
       FROM Chilren c) 
+2

no he probado pero supongo que esto es más lento que una combinación. – Hogan

+3

@Hogan: existe el enfoque más rápido. El optimizador hará el mismo plan de ejecución para una unión externa marcada nula ... que será ** como ** rápida, pero la existencia nunca es más lenta. –

+0

aseado. Gracias @Nick. Esto es cierto para mysql, ms sql y oráculo? – Hogan

1
SELECT p.* 
FROM Parent p 
WHERE EXISTS (SELECT 'X' FROM Children c WHERE c.parent = p.id); 
2
Select p.id, p.text 
from Parent p 
inner join Children c on p.id = c.parent 
group by p.id, p.text 
12

Un inner join solamente devuelve filas que coinciden ambas tablas:

select distinct p.* 
from Parent p 
inner join Children c on c.parent = p.id 
+1

esto es, en mi opinión, la forma más directa de lograr esto y debería ser la respuesta aceptada. – adriandz

Cuestiones relacionadas