代码之家  ›  专栏  ›  技术社区  ›  Rodney Schuler

SQL Server 2005:检测分层数据中的循环

  •  1
  • Rodney Schuler  · 技术社区  · 15 年前

    我有一个典型的ID,parentID形式的分层数据表。

    CREATE TABLE Hierarchy (Id int, ParentId int NULL, Name varchar(128));
    INSERT INTO Hierarchy VALUES (1, NULL, '1');
    INSERT INTO Hierarchy VALUES (2, NULL, '2');
    INSERT INTO Hierarchy VALUES (3, NULL, '3');
    INSERT INTO Hierarchy VALUES (4, 1, '1.1');
    INSERT INTO Hierarchy VALUES (5, 1, '1.2');
    INSERT INTO Hierarchy VALUES (6, 4, '1.1.1');
    

    我需要在现有数据中检测如下循环。

    Id  ParentId  Name
    27  8         'foo'
    8   19        'bar'
    19  27        'busted'
    

    ID来自另一个表,因此我不能将ID的排序作为解决方案的一部分。大约有120万行。数据是大量高度为1-5的独立树。其目的是清除数据以消除循环,然后向表中添加触发器以防止将来出现循环。

    我知道 the algorithms 用于循环检测。在我看来,这应该是一个常见的问题。所以,我想知道在SQL Server的“box”中是否有一种简便的方法可以用最少的代码来完成这个任务。

    1 回复  |  直到 15 年前
        1
  •  1
  •   torial    15 年前

    如果您有SQL Server 2005,可以使用WITH子句对表进行递归查询。这将使你的逻辑崩溃,因为这似乎是你的主要目标。

    http://blogs.msdn.com/craigfr/archive/2007/10/25/recursive-ctes.aspx