改进递归SQL循环

时间:2014-11-19 11:05:53

标签: sql tsql

我正在尝试解决当我们拥有大量数据时出现的继承系统的性能问题。

我们有一个包含两个字段的表" 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"列是不可能的(我已经问过了,因为这样可以彻底解决问题!)

2 个答案:

答案 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的更多信息:

http://msdn.microsoft.com/en-us/library/ms186243.aspx

答案 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  .....