ifo*_*ooi 0 sql-server recursion
我尝试在 SQL Server 中执行 SQL-1999 样式递归
 CREATE TABLE addressparts(
    AddrPartId INTEGER NOT NULL,
    ParentID INTEGER NOT NULL,
    AddrPartTypeId VARCHAR(30),
    Name VARCHAR(30),
    constraint PK_OBJECTS primary key (AddrPartId))
insert into addressparts values (1, 0, 'country','Zimbabwe');
insert into addressparts values (2, 1, 'city','zi');
insert into addressparts values (3, 2, 'subcity','kalkli');
insert into addressparts values (4, 2, 'subcity','kalkli1');
Run Code Online (Sandbox Code Playgroud)
我想要选择递归查询
WITH 
 Rec (AddrPartId, ParentID, AddrPartTypeId, name)
 AS (
   SELECT AddrPartId, ParentID, AddrPartTypeId, name FROM addressparts
   UNION ALL
   SELECT Rec.AddrPartId, Rec.ParentID, rec.AddrPartTypeId, Rec.name
    FROM Rec
    inner join addressparts on Rec.AddrPartId = addressparts.ParentID
   )
 SELECT * FROM Rec 
 WHERE ParentID=0;
Run Code Online (Sandbox Code Playgroud)
但我有标题错误
我想要预期的结果
AddrPartId ParentID
1 0
2 1
3 2
4 2
Run Code Online (Sandbox Code Playgroud)
按级别
默认情况下,递归 CTE 将执行 100 次递归。
在 cte 末尾添加选项 max recursion 以增加默认递归。但是您的查询中也存在逻辑错误。如果没有错,你正在寻找这样的东西
;WITH Rec (AddrPartId, ParentID, AddrPartTypeId, NAME)
     AS (SELECT AddrPartId,
                ParentID,
                AddrPartTypeId,
                NAME
         FROM   addressparts
         WHERE  ParentID = 0 -- add the parent id filter here 
         UNION ALL
         SELECT A.AddrPartId,  -- don't select from recursive cte 
                A.ParentID,
                A.AddrPartTypeId,
                A.NAME
         FROM   Rec
                INNER JOIN addressparts A
                        ON Rec.AddrPartId = A.ParentID)
SELECT *
FROM   Rec
OPTION (maxrecursion 0); -- here
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5687 次  |  
        
|   最近记录:  |