我正在尝试解决当我们拥有大量数据时出现的继承系统的性能问题。
我们有一个包含两个字段的表" ItemID"和" ParentItemID"。 " ParentItemID"字段涉及同一个talbe中的另一行,其中" ItemID"字段匹配此行" ParentItemID"字段。
这种关系可以是很多很多行。
正在运行以下查询,看起来它可能是减速的另一个原因:
WHILE 1=1
BEGIN
SELECT @ParentID = ParentItemID FROM Items WHERE ItemID = @LastParentID
IF @parentID IS NULL
BEGIN
break
END
ELSE
BEGIN
SET @LastParentID = @ParentID
END
END
有没有更好的方法进行这种递归搜索?
注意:此时我们不允许更改表格,因此添加" RootItemID"列是不可能的(我已经问过了,因为这样可以彻底解决问题!)
答案 0 :(得分:3)
您可以使用公用表表达式:
WITH Antecedents (ITemID, ParentItemID, Level)
AS
(
-- Anchor member definition
SELECT ItemID, ParentItemID, 0 AS Level FROM Items WHERE ItemID = @StartingID
UNION ALL
SELECT ItemID, ParentItemID, Antecedents.Level + 1 AS Level
FROM Items
INNER JOIN Antecedents
ON Antecedents.ParentItemID = Items.ItemID
)
SELECT TOP 1 @LastParentID = ItemID
FROM Antecedents
ORDER BY Level DESC
有关递归CTE的更多信息:
答案 1 :(得分:1)
你可以通过Common Table Expression
来完成:
;WITH cte_hierarchy
AS (SELECT *
FROM item
WHERE ItemID = @ParentID
UNION ALL
SELECT i.*
FROM item i
JOIN cte_hierarchy h
ON i.ItemID = h.ParentItemID)
SELECT *
FROM cte_hierarchy
WHERE .....