comment supprimer un tree dans une table auto-référencée?

J'ai le tableau suivant:

MyTree(IDNode, IDRootNode, IDParentNode, Left, Right, Depth, ...) 

IDNode est la key primaire qui identifie le nœud. IDRootNode est le noeud racine. IDParentNode est le noeud parent du noeud. Gauche et Droite est la position du nœud. Ce n'est pas important pour la suppression.

Je vois le code suivant, est un triggersur, qui permet de supprimer des registres d'une table auto-référencée:

 CREATE TRIGGER MyTable_OnDelete ON MyTable INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON; DELETE FROM mt FROM deleted AS D JOIN MyTable AS mt ON d.Id = mt.ParentId DELETE FROM mt FROM deleted AS D JOIN MyTable AS mt ON d.Id = mt.Id END 

Si je ne me trompe pas, d'abord supprimer les enfants d'un nœud que je veux supprimer, et plus tard supprimer le nœud. Mais si un enfant a des enfants, est supprimé ou supprime seulement les enfants du nœud et non les enfants des enfants?

Et avec CTE recrsive comment serait-ce?

Merci.

Vous pouvez le faire avec CTE récursif comme ceci:

 ;WITH cte AS ( SELECT IDNode FROM Deleted UNION ALL SELECT IDNode FROM MyTree t JOIN cte c ON t.IDParentNode = c.IDNode ) DELETE t FROM MyTree t JOIN cte c ON t.IDNode = c.IDNode; 

Mieux encore, utilisez HierarchyId (si sur SQL Server 2008)!

Si chaque nœud de l'arborescence contient la colonne IDRootNode remplie avec l'ID de l'arborescence à laquelle appartient le nœud, vous pouvez supprimer l'arborescence en utilisant le code SQL suivant:

 DELETE MyTable WHERE IDRootNode = @RootNodeId 

Nécromage.
Des solutions hilarantes ici.
Pour ceux qui n'ont plus aucune raison, vous devez savoir qu'il existe une cascade de suppression.

Exemple:

 FOREIGN KEY (parent_id) REFERENCES table_name(id) ON DELETE CASCADE 

Alors vous pouvez faire:

 DELETE FROM table_name WHERE id = @root_id 

Et il cascade automagiquement la suppression dans l'tree.
Aucune hiérarchie ou CTE nécessaire et aucune récursion non plus.