Come implementare un & # 8220; hasChildren & # 8221; Istruzione SELECT in SQL?
Domanda
Diciamo che ho la seguente tabella:
ID | parentID | MoreStuff
1 | -1 | ...
2 | 1 | ...
3 | 1 | ...
4 | 2 | ...
5 | 1 | ...
Come posso generare un'istruzione SQL SELECT per scoprire se una riga specifica ha figli? In altre parole, voglio sapere se l'ID 1 ha figli, che in questo caso ha 3.
Non sono sicuro di come creare l'istruzione SQL:
SELECT ID, hasChildren FROM myTable;
Cosa verrebbe sostituito per hasChildren nell'istruzione SQL SELECT sopra?
Soluzione
Nessuna versione di gruppo:
SELECT MyTable.Id, CASE WHEN EXISTS
(SELECT TOP 1 1 --you can actually select anything you want here
FROM MyTable MyTableCheck
WHERE MyTableCheck.ParentId = MyTable.Id
) THEN 1 ELSE 0 END AS HasRows
FROM MyTable
Altri suggerimenti
Unisciti al tavolo su se stesso per scoprire se ha figli:
SELECT
parent.id as ID
, case when count(child.id) > 0 then 1 else 0 end as hasChildren
FROM myTable parent
LEFT JOIN myTable child
ON child.parentID = parent.ID
GROUP BY parent.id
Se conosci già l'ID padre, la query è semplice: seleziona il numero di righe con quell'ID padre.
SELECT count(*) FROM myTable where parentID = 1;
Ci sono risposte molto valide alla tua domanda che funzioneranno. Tuttavia, prenderei in considerazione le prestazioni di tale query se il tuo set di dati è molto grande.
Se hai intenzione di utilizzare una Query di gruppo o secondaria per ottenere i dati, assicurati che entrambe le colonne ID e Parent abbiano indici separati.
Per ottenere prestazioni ancora migliori, devi aggiungere una colonna chiamata " haschildren " che potrebbe essere un "bit" tipo di dati. Questa colonna dovrebbe quindi essere aggiornata dal codice dell'applicazione quando gli elementi vengono inseriti o eliminati. Ciò ti consentirebbe di eseguire la query molto più veloce:
SELECT * FROM table WHERE haschildren IS NOT NULL
Le soluzioni sopra sono buone, ma non dovresti aggiungere colonne come 'haschildren' a meno che tu non abbia davvero un problema di prestazioni (vedi il post di GateKiller). Tale colonna denormalizza il database, ovvero la stessa informazione verrà archiviata in 2 punti, il che rende più probabile che i tuoi dati diventino incoerenti. Dovrai mantenere questa colonna ogni volta che inserisci un nuovo figlio, ne elimini uno esistente o aggiorni il genitore di un figlio.