我可以避免在这种递归查找场景中使用游标吗?
Can I avoid using cursor in this recursive lookup scenario?
我有一个 Table 叫做 Item。设计是这样的:
ItemTable[
ItemID int,
ItemName varchar(50),
ParentItemId int ]
我想要的是找到所有具有祖先 ID 的项目并执行一些操作(例如删除、更新)。
假设我有六件物品,
For Item 1, the parentItemId is null,
for Item 2, the parentId is 1,
for Item 3, the parentId is 1
Item 4, parent id 2,
item 5, parent id 2,
item 6, parent id 4
我想找到祖先 ID 为 2 的所有项目。所以应该是 4,5 和 6。
在sql的世界里,我可以用游标来做。但是想知道是否可以使用聪明的 CTE 来完成?
您可以使用递归 CTE:
;WITH cte(ItemID, ItemName,ParentItemId) AS (
SELECT ItemID, ItemName, ParentItemId
FROM #ItemTable
WHERE ParentItemId IS NOT NULL
UNION ALL
SELECT i.ItemID, i.ItemName, t.ParentItemId
FROM cte t
JOIN #ItemTable i
ON t.ItemID = i.ParentItemId
), cte2 AS -- filter records with Ancestor = 2
(
SELECT *
FROM cte
WHERE ParentItemId = 2
)
UPDATE #ItemTable -- UPDATE/DELETE operation
SET ItemName = CONCAT('Updated Name: ', i1.ItemName)
FROM #ItemTable i1
JOIN cte2 c2
ON i1.ItemID = c2.ItemId;
SELECT *
FROM #ItemTable;
我有一个 Table 叫做 Item。设计是这样的:
ItemTable[
ItemID int,
ItemName varchar(50),
ParentItemId int ]
我想要的是找到所有具有祖先 ID 的项目并执行一些操作(例如删除、更新)。
假设我有六件物品,
For Item 1, the parentItemId is null,
for Item 2, the parentId is 1,
for Item 3, the parentId is 1
Item 4, parent id 2,
item 5, parent id 2,
item 6, parent id 4
我想找到祖先 ID 为 2 的所有项目。所以应该是 4,5 和 6。
在sql的世界里,我可以用游标来做。但是想知道是否可以使用聪明的 CTE 来完成?
您可以使用递归 CTE:
;WITH cte(ItemID, ItemName,ParentItemId) AS (
SELECT ItemID, ItemName, ParentItemId
FROM #ItemTable
WHERE ParentItemId IS NOT NULL
UNION ALL
SELECT i.ItemID, i.ItemName, t.ParentItemId
FROM cte t
JOIN #ItemTable i
ON t.ItemID = i.ParentItemId
), cte2 AS -- filter records with Ancestor = 2
(
SELECT *
FROM cte
WHERE ParentItemId = 2
)
UPDATE #ItemTable -- UPDATE/DELETE operation
SET ItemName = CONCAT('Updated Name: ', i1.ItemName)
FROM #ItemTable i1
JOIN cte2 c2
ON i1.ItemID = c2.ItemId;
SELECT *
FROM #ItemTable;