Question

Disons que j'ai le tableau suivant:

ID | parentID | MoreStuff
1  | -1       |  ...
2  |  1       |  ...
3  |  1       |  ...
4  |  2       |  ...
5  |  1       |  ...

Comment puis-je générer une instruction SQL SELECT pour savoir si une ligne spécifique a des enfants? En d’autres termes, je veux savoir si l’ID 1 a des enfants, alors qu’il en a 3.

Je ne sais pas comment créer l'instruction SQL:

SELECT ID, hasChildren FROM myTable;

Qu'est-ce qui serait remplacé pour hasChildren dans l'instruction SQL SELECT ci-dessus?

Était-ce utile?

La solution

Pas de version de groupe:

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

Autres conseils

Rejoignez la table sur elle-même pour savoir si elle a des enfants:

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

Si vous connaissez déjà l'ID parent, la requête est simple: il vous suffit de sélectionner le nombre de lignes portant cet ID parent.

SELECT count(*) FROM myTable where parentID = 1;

Il existe des réponses très valables à votre question qui fonctionneront. Toutefois, je considérerais les performances d’une telle requête si votre jeu de données est très volumineux.

Si vous allez utiliser une requête Group By ou Sub pour obtenir les données, assurez-vous que les colonnes ID et Parent possèdent des index distincts.

Pour obtenir des performances encore meilleures, vous devez ajouter une colonne intitulée "haschildren". ce qui pourrait être un "bit" Type de données. Cette colonne doit ensuite être mise à jour à partir du code de votre application lorsque des éléments sont insérés ou supprimés. Cela vous permettrait d’exécuter la requête beaucoup plus rapide:

SELECT * FROM table WHERE haschildren IS NOT NULL

Les solutions ci-dessus sont acceptables, mais vous ne devriez pas ajouter de colonne comme "haschildren" sauf si vous avez vraiment un problème de performances (voir l'article de GateKiller). Une telle colonne dénormalise la base de données, c’est-à-dire que les mêmes informations sont stockées à deux endroits, ce qui augmente les risques de perte de cohérence de vos données. Vous devrez gérer cette colonne chaque fois que vous insérez un nouvel enfant, en supprimez un déjà existant ou mettez à jour le parent d'un enfant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top