0

以下代码产生: 语句终止。在语句完成之前,最大递归 100 已用完。

我正在尝试与所有父母和孩子建立一个列表。ArtikelCEId = 7 是硬编码的示例。

仅使用 1 个 UNION ALL(查找父母或孩子)运行 CTE 效果很好。

相同类型的编码描述在:http ://sqlmag.com/t-sql/ctes-multiple-recursive-members

create table Article(
    ArtikelCEId int,
    VervangenDoorArtikelCEId int
) 

insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (1, 2)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (2, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId )  values (3, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (5, 7)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (7, 8)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (8, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (9, null)
insert into Article (ArtikelCEId, VervangenDoorArtikelCEId ) values (10, null)

;                                       
WITH ArtikelCE_CTE(ArtikelCEId, VervangenDoorArtikelCEId) AS 
( 
  SELECT a.ArtikelCEId, a.VervangenDoorArtikelCEId
  from Article a 
    where a.ArtikelCEId = 7

    /*find parents */
  UNION ALL
  SELECT b.ArtikelCEId, b.VervangenDoorArtikelCEId
  FROM ArtikelCE_CTE acteP 
  INNER JOIN Article b 
    ON b.ArtikelCeId = acteP.VervangenDoorArtikelCEId  

  /*find childs */
  UNION ALL
  SELECT c.ArtikelCEId, c.VervangenDoorArtikelCEId
  FROM ArtikelCE_CTE acteC 
  INNER JOIN Article c 
    ON c.VervangenDoorArtikelCEId = acteC.ArtikelCeId    
  where c.VervangenDoorArtikelCEId is not null

)


SELECT  ArtikelCeId, VervangenDoorArtikelCEId FROM ArtikelCE_CTE
4

2 回答 2

2

我建议将您的查询分成两个单独的 CTE - 一个给父母,一个给孩子,最后加入他们。在您的想法中-您正在陷入无限循环,因为当将第二个联合部分(针对孩子)应用于第一个联合部分(找到的父母)时,您会再次获得原始值。

WITH ArtikelCE_CTE_Parents(ArtikelCEId, VervangenDoorArtikelCEId) AS 
( 
  SELECT a.ArtikelCEId, a.VervangenDoorArtikelCEId
  from Article a 
    where a.ArtikelCEId = 7

    /*find parents */
  UNION ALL
  SELECT b.ArtikelCEId, b.VervangenDoorArtikelCEId
  FROM ArtikelCE_CTE_Parents acteP 
  INNER JOIN Article b 
    ON b.ArtikelCeId = acteP.VervangenDoorArtikelCEId  
)
, ArtikelCE_CTE_Children(ArtikelCEId, VervangenDoorArtikelCEId) AS 
( 
  SELECT a.ArtikelCEId, a.VervangenDoorArtikelCEId
  from Article a 
    where a.ArtikelCEId = 7

  /*find children */
  UNION ALL
  SELECT c.ArtikelCEId, c.VervangenDoorArtikelCEId
  FROM ArtikelCE_CTE_Children acteC 
  INNER JOIN Article c 
    ON c.VervangenDoorArtikelCEId = acteC.ArtikelCeId    
  where c.VervangenDoorArtikelCEId is not null

)
SELECT  ArtikelCeId, VervangenDoorArtikelCEId FROM ArtikelCE_CTE_Parents
UNION 
SELECT  ArtikelCeId, VervangenDoorArtikelCEId FROM ArtikelCE_CTE_Children
于 2013-10-16T15:37:14.200 回答
0

添加到查询末尾:

OPTION (MAXRECURSION 1000)

...具有最大允许值 32767 的任何值。

于 2013-10-16T15:17:57.730 回答