2010-08-12 3 views
2

Tableau StructureSupprimer Reccords d'une table récursive - SQL Server 2008

ID  DESC    PARENT_ID** 

35151 Parent   35154 
35152 System   35151 
35153 Same as System 35151 
35154 ParentsParent  35157 
35156 Product   35157 
35157 Login Group  35159 

Id est la clé primaire et id_parent est la clé étrangère référencée dans la même table

Comment Je supprime les enregistrements de manière récursive, en commençant par le dernier enfant jusqu'au parent. S'il n'y a aucun enregistrement enfant, l'enregistrement parent doit être supprimé. Je dois utiliser la transaction avec rollback si quelque chose d'étrange se produit. Aide appréciée

Répondre

1

Regardez à cette question:

SQL Server: Self-reference FK, trigger instead of ON DELETE CASCADE

le FK ON SUPPRIMER CASCADE ne fonctionne dans SQL Express 2005, peut-être cela fonctionne en 2008

ALTER TABLE SomeChildTable 
CONSTRAINT YOurConstraintName 
FOREIGN KEY (YourParentId) 
REFERENCES YourParentTable(ParentTableId) ON DELETE CASCADE; 
+0

Je ne peux pas utiliser la gâchette dès maintenant. Puis-je le faire sans déclenchement? – SRA

+0

@ Sun Ramu, j'ai mis à jour la réponse, mais il ne pouvait pas fonctionner dans MSSQL, mais essayez s'il vous plaît. –

5

Vous pouvez utiliser un CTE récursif pour obtenir la liste à supprimer.

https://data.stackexchange.com/stackoverflow/query/9287/so3466713

-- SO3466713 

CREATE TABLE #t (
    ID int NOT NULL 
    ,[DESC] varchar(50) NOT NULL 
    ,PARENT_ID int NULL 
) 

INSERT INTO #t VALUES 
(35151, 'Parent', 35154) 
,(35152, 'System', 35151) 
,(35153, 'Same as System', 35151) 
,(35154, 'ParentsParent', 35157) 
,(35156, 'Product', 35157) 
,(35157, 'Login Group', 35159) 

;WITH tree AS (
    SELECT * 
    FROM #t 
    WHERE [DESC] = 'Parent' 

    UNION ALL 

    SELECT c.* 
    FROM #t AS c 
    INNER JOIN tree AS p 
     ON c.PARENT_ID = p.ID 
) 
-- SELECT * 
-- FROM tree 
DELETE FROM #t WHERE ID IN (SELECT ID FROM tree) 

SELECT * FROM #t​ 
+0

La description est juste un texte. S'il vous plaît ignorez-le. Le facteur important est ID et ParentId. – SRA

+0

@Sunil Ramu - [DESC] est juste utilisé pour identifier l'arbre que vous voulez supprimer. Vous pouvez définir les critères que vous souhaitez identifier le nœud racine à partir duquel vous devez supprimer tous les enfants. –

+0

+1, bon exemple de code –