我有這樣SQL:刪除子樹表(ID,PARENTID),刪除一個項目,他所有的孩子
foo(id, parentId)
-- there is a FK constraint from parentId to id
一個表,我需要他的所有孩子和孩子刪除項目兒童等 任何人都知道如何?
我有這樣SQL:刪除子樹表(ID,PARENTID),刪除一個項目,他所有的孩子
foo(id, parentId)
-- there is a FK constraint from parentId to id
一個表,我需要他的所有孩子和孩子刪除項目兒童等 任何人都知道如何?
AFAIK,SQL SERVER
不喜歡級聯刪除的層級關係。所以你可以做兩個CTE(如提到的Oded)或者一個帶有遞歸觸發器的解決方案(比如this)。但我想,CTE更容易。
看,這裏是使用的解決方案CTE:
CREATE PROC deleteFoo
@id bigint
as
WITH Nodes ([Id], [ParentId], [Level])
AS (
SELECT F.[Id], F.[ParentId], 0 AS [Level]
FROM [dbo].Foo F
WHERE F.[Id] = @id
UNION ALL
SELECT F.[Id], F.[ParentId], N.[Level] + 1
FROM [dbo].Foo F
INNER JOIN Nodes N ON N.[Id] = F.[ParentId]
)
DELETE
FROM Foo
WHERE [Id] IN (
SELECT TOP 100 PERCENT N.[Id]
FROM Nodes N
ORDER BY N.[Level] DESC
)
首先,我們定義遞歸CTE,然後從[Foo]
表從一子記錄開始刪除記錄(hightest Level
;所以,頂節點將在最後一圈被刪除)。
您可以編寫一個recursive CTE,錨點將是最初的Id。
好點。已經掩蓋了我的答案! – 2010-05-07 09:31:07
什麼是百分之百最好的東西?它會刪除前100行嗎? – Omu 2010-05-07 11:20:54
@歐姆,不。 「TOP 100 PERCENT」意味着所有的記錄。沒有它,你會得到'ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中是無效的,除非TOP或FOR XML也被指定。所以這只是一個解決方法。 – Alex 2010-05-07 11:27:33