【问题标题】:Conditional Recursive SQL Select条件递归 SQL 选择
【发布时间】:2023-03-31 16:08:01
【问题描述】:

考虑以下数据库表。它由 3 列组成:Id、ParentId、Enabled。

我想生成一个类似于以下的结果集。基本上,对于具有 Parent ID 的每条记录,我想显示一个附加列 Enabled Parent Id。该列基本需要递归检查key的层次结构,当找到Enabled = True的key时停止。

我希望这可以即时实现,而无需在表中添加任何额外的计算列。

也许这可以使用 CTE 来实现。

【问题讨论】:

  • Stackoverflow 不是一种“为我编写代码”的服务,您在这里工作了将近 4 年后应该很清楚这一点。请展示你的努力。
  • @ZoharPeled 你是对的,但是我被困在这里。我一直在尝试为此问题创建 CTE,但似乎无法使其正常工作。
  • @a_horse_with_no_name MsSQL

标签: sql sql-server recursion common-table-expression recursive-query


【解决方案1】:

试试这个 CTE 查询:

WITH T1 as 
(SELECT id,
        parentId,
        NULL as EnabledParentId, 
        ParentID as NextParent 
        FROM T
        WHERE ParentID is not null
UNION ALL
SELECT T1.id, 
       T1.parentId, 
       CASE WHEN T.enabled = 1 
            THEN T.ID 
            ELSE NULL END 
              as EnabledParentId,
       T.ParentID as NextParent
 FROM T1 
 JOIN T ON T1.NextParent = T.Id
 WHERE (nextParent is not Null) and (EnabledParentId IS NULL)
)
SELECT ID,
       ParentID,
       EnabledParentID 
       FROM T1 
       WHERE EnabledParentId IS NOT NULL 
             OR NextParent IS NULL
       ORDER BY ID;

【讨论】:

    【解决方案2】:
    DECLARE @myTable TABLE
    (
        Id INT NOT NULL,
        ParentId INT NOT NULL,
        EnabledParentId INT
    )
    
    DECLARE myCursor CURSOR FOR
    SELECT Id
    FROM T
    WHERE ParentId IS NOT NULL
    ORDER BY Id;
    
    OPEN myCursor;
    
    DECLARE @currentId INT;
    
    FETCH NEXT FROM myCursor INTO @currentId;
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        DECLARE @Exists BIT = 0;
    
        DECLARE @ParentId INT               
        SELECT @ParentId = ParentId
        FROM T
        WHERE Id = @currentId
    
        WHILE (@ParentId IS NOT NULL AND @Exists = 0)
        BEGIN                   
    
            IF EXISTS(SELECT * FROM T WHERE Id = @ParentId AND IsEnabled = 1)
            BEGIN
    
                SET @Exists = 1             
    
            END
            ELSE
            BEGIN
    
                    SELECT @ParentId = ParentId
                    FROM T
                    WHERE Id = @ParentId
    
            END
    
            IF (@Exists = 1 OR @ParentId IS NULL)
            BEGIN
                INSERT INTO @myTable
                SELECT Id, ParentId, @ParentId
                FROM T
                WHERE Id = @currentId       
            END
    
    
    
        END
    
       FETCH NEXT FROM myCursor INTO @currentId;
    END
    
    CLOSE myCursor;
    DEALLOCATE myCursor;
    
    SELECT *
    FROM @myTable
    ORDER BY 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2011-10-20
      • 2010-11-05
      • 2017-03-30
      • 2018-03-08
      相关资源
      最近更新 更多