J'ai un arbre, où un nœud spécifique dans l'arborescence peut apparaître dans un autre nœud de l'arborescence. (2 dans mon exemple):SQL Server ignore les relations en double (enfant parent) dans la récursivité
1
/ \
2 3
/ \ \
4 5 6
\
2
/ \
4 5
L'avis 2 est dupliqué. D'abord sous 1 et deuxième sous 6. Mon récursion est:
with cte (ParentId, ChildId, Field1, Field2) AS (
select BOM.ParentId, BOM.ChildId, BOM.Field1, BOM.Field2
from BillOfMaterials BOM
WHERE ParentId=x
UNION ALL
SELECT BOM.ParentId, BOM.ChildId, BOM.Field1, BOM.Field2 FROM BillOfMaterials BOM
JOIN cte on BOM.ParentId = cte.ChildId
)
select * from cte;
Mais le problème est que dans le résultat par rapport 2-4 et 2-5 est dupliquée (première de la relation 1-2 et seconde de la relation 6 -2):
ParentId ChildId OtherFields
1 2
1 3
2 4 /*from 1-2*/
2 5 /*from 1-2*/
3 6
6 2
2 4 /*from 6-2*/
2 5 /*from 6-2*/
Est-il possible d'ignorer les relations dupliquées? Je ne vois pas de logique pourquoi la récursivité doit-elle être exécutée sur les lignes qui sont déjà dans le résultat. Ce serait plus rapide. Quelque chose comme ça:
with cte (ParentId, ChildId, Field1, Field2) AS (
select BOM.ParentId, BOM.ChildId, BOM.Field1, BOM.Field2
from BillOfMaterials BOM
WHERE ParentId=x
UNION ALL
SELECT BOM.ParentId, BOM.ChildId, BOM.Field1, BOM.Field2 FROM BillOfMaterials BOM
JOIN cte on BOM.ParentId = cte.ChildId
------> WHERE (select count(*) FROM SoFarCollectedResult WHERE ParentId=BOM.ParentId AND ChildId=BOM.ChildId) = 0
)
select * from cte;
J'ai trouvé this thread, mais il est de 8 ans.
J'utilise SQL Server 2016.
Si ce n'est pas possible, alors ma question est de savoir comment puis-je supprimer les doublons du résultat final, mais vérifiez distinct seulement sur les colonnes ParentId et ChildId?
Modifié:
résultat attendu est:
ParentId ChildId OtherFields
1 2
1 3
2 4
2 5
3 6
6 2
Comment différenciez-vous 2 enfants de 1 et 2 enfants de 6? –
Vos données sont erronées. Vous ne pouvez pas mettre ça ensemble comme ça. Comment savez-vous qu'un ensemble de 2,4 appartient à moins de 1 et l'autre à moins de 6 ans? Si vous avez besoin de ce type de relation, vous devez reconstruire votre structure de données car cela ne fonctionnera pas en tant que parent standard. –
Il y a un problème fondamental ici. Un arbre peut être traversé selon différentes méthodologies. Il n'y a pas de véritable sens du «premier» - qui est de dire quelle occurrence d'un nœud mérite les enfants. Les nœuds ne peuvent pas être «instanciés», puis distingués par leur ascendance, ce qui fait qu'ils ne sont plus des nœuds. – Greenspark