2016-12-19 30 views
0

刪除父和子SQL從子刪除父/刪除整個樹中循環

表1(父表)

Id int 

表2(關係表)

Id1 int FOREIGN KEY (Id1) REFERENCES Table1 (Id)  
Id2 int FOREIGN KEY (Id2) REFERENCES Table1 (Id) 

Id - Id1 one to one or one to zero relationship 
Id - Id2 one to many 

數據在表1

Id 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10  

在表中的數據2

Id1 Id2 
2 1 
3 1 
4 2 
5 2 
6 4 
7 4 
8 5 
9 5 

所以,如同與根樹作爲1種

1 has two childs 2 and 3 
2 has two childs 4 and 5 
4 has two childs 6 and 7 
5 has two childs 8 and 9 
3,6,7,8,9,10 has no child 

最佳可能的方式來實現後述的情況下:

刪除1 =>刪除完整表2和(表10除外1)表1

回答

0

你可以用做Recursive CTE

然後
;WITH cte 
    AS (SELECT Id1, 
       Id2, 
       id2 AS parent 
     FROM Yourtable 
     UNION ALL 
     SELECT a.Id1, 
       a.Id2, 
       b.Id2 
     FROM cte a 
       JOIN Yourtable b 
        ON a.parent = b.id1) 
SELECT * 
FROM cte 
WHERE parent = 1 
OPTION (maxrecursion 0) 
--DELETE FROM Yourtable 
--WHERE id1 IN (SELECT id1 
--    FROM cte 
--    WHERE parent = 1) 
--OPTION (maxrecursion 0) 

如果select正在返回預期的結果發表意見select和取消註釋Delete

0

嘗試

update table2 set id2 = null; 
delete from table1 where id <> 10; 
delete from table2; 
+0

這個例子中的問題是小數據,真實數據有成千上萬像10行。 – Gokuh

+0

真實數據具有數千棵樹和數千個獨立行。所有樹木都不需要刪除,有些樹木將被刪除,它不適用於大數據集。 對不起2條評論,我無法編輯以前的評論。 – Gokuh