2010-04-03 10 views
12

Ho una semplice relazione uno-a-molti. Vorrei selezionare le righe dal genitore solo quando hanno almeno un figlio. Quindi, se non ci sono figli, la riga genitore non viene restituita nel set di risultati.Come selezionare la riga padre solo se ha almeno un figlio?

Es.

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

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

Voglio che i risultati siano:

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

risposta

15

È possibile farlo usando un EXISTS, come questo:

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

o utilizzando un IN come questo:

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

non ho ancora testato, ma sto cercando di indovinare questo è più lento di un join. – Hogan

+3

@Hogan - Esiste l'approccio più veloce. L'ottimizzatore farà lo stesso piano di esecuzione per un join esterno controllato con null ... che sarà ** come ** veloce, ma l'esistente non è mai più lento. –

+0

Neat. Grazie @ Nick. Questo è vero per mysql, ms sql e oracle? – 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 restituisce solo le righe che corrispondono a entrambe le tabelle:

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

questo è, a mio avviso, il modo più semplice per ottenere questo risultato e dovrebbe essere la risposta accettata. – adriandz

Problemi correlati