Come implementare un & # 8220; hasChildren & # 8221; Istruzione SELECT in SQL?

StackOverflow https://stackoverflow.com/questions/1805671

  •  05-07-2019
  •  | 
  •  

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top