2010-05-07 182 views

回答

11

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;所以,頂節點將在最後一圈被刪除)。

+2

好點。已經掩蓋了我的答案! – 2010-05-07 09:31:07

+0

什麼是百分之百最好的東西?它會刪除前100行嗎? – Omu 2010-05-07 11:20:54

+0

@歐姆,不。 「TOP 100 PERCENT」意味着所有的記錄。沒有它,你會得到'ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中是無效的,除非TOP或FOR XML也被指定。所以這只是一個解決方法。 – Alex 2010-05-07 11:27:33