0

今天是个好日子!首先,我为我糟糕的英语感到抱歉。好吧,我有一个问题,您可以在此消息的标题中阅读。

当我尝试选择必要的数据时,SQL Server 会返回此消息(错误 253)。

“来自 CTE 的递归元素(名称为‘recurse’——我的笔记)在 CTE 中有多个引用。

我怎么解决这个问题?

你能建议我如何连接两个表(有 2 列(例如:a 和 b),它们是先前递归选择的结果(我正在写相同的选择,但关于 if 的另一个迭代)

    with recurse (who_acts,on_whom_influence)
as 
(
-------------------------------------------FIRST SELECT
select  distinct interface_1.robot_name as who_acts,interface_2.robot_name as on_whom_influence
from INTERFACE as interface_1,INTERFACE as interface_2
    where (interface_1.number in (                                  select  INPUT_INTERFACE.source
                                        from INPUT_INTERFACE
                                )
            and interface_2.number in (
                                        select INPUT_INTERFACE.number 
                                        from INPUT_INTERFACE
                                        where (INPUT_INTERFACE.source=interface_1.number )
                                     )
          )

-------------------------------------------RECURSIVE PART   
union all
select rec1.who_acts,rec1.on_whom_influence
from recurse as rec1
inner join 
(select rec2.who_acts,rec2.on_whom_influence
from recurse as rec2) as P on (1=1)
)
select  * from recurse

问题在于递归CTE。连接条件并不简单,但对这个问题没有影响。你能在评论中输入一些工作代码吗

4

1 回答 1

2

这是一张假表

create table tbl1 ( a int, b int );
insert tbl1 select 1,2;
insert tbl1 select 11,12;
insert tbl1 select 2,3;
insert tbl1 select 4,5;

还有一个与你类似的查询

with cte as (
  select a,b from tbl1
  union all
  select x.a,x.b from cte x join cte y on x.a=y.a+1
)
select * from cte;

错误:

公用表表达式“cte”的递归成员具有多个递归引用。: with cte as (select a,b from tbl1 union all select xa,xb from cte x join cte y on xa=y.a+1) select * from cte

基本上,错误正是它所说的。在递归部分中,递归 CTE 的出现次数不能超过 ONCE。在上面,您看到CTE别名为xy。这种限制有多种原因,例如 CTE 是深度优先递归的,而不是逐代递归的。


应该考虑的是为什么您会多次需要它。您的递归部分没有意义。

select rec1.who_acts,rec1.on_whom_influence
from recurse as rec1
inner join 
(   select rec2.who_acts,rec2.on_whom_influence
    from recurse as rec2) as P on (1=1)

从表面上看,如果recurse是真实表(非 CTE),则以下情况是正确的:

  1. 生成的行数为count(recurse as [rec1]) x count(recurse as [rec2])
  2. 递归(rec1)中的行在递归中每行复制,因此#1
  3. rec2 中的列从不使用。rec2 仅用于乘法

如果允许运行,则查询的递归部分将继续以二次方增加其行数并且永远不会完成。

于 2013-05-10T12:50:30.890 回答