0

모두 좋은 하루! 첫째, 가난한 영어에 대해 유감입니다. 글쎄, 나는이 메시지의 제목에서 읽을 수있는 질문이있다.SQL Server에서 이전 재귀 선택의 결과 인 두 개의 동일한 테이블을 조인하는 방법

SQL Server는 필요한 데이터를 선택하려고 할 때이 메시지 (오류 253)를 반환합니다.

Translate "Recursive element from CTE (which name is 'recurse' - my note) has multiple reference in CTE.

이 문제를 어떻게 해결할 수 있습니까?

이전 재귀 선택 결과 인 두 개의 열 (예 : 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.The 연결 조건이 간단하지 않다,하지만이 문제에 아무런 영향이없는 같이 Recurse입니다. 당신이

+2

** 당신은 ** 문제의 질문을 ** 표시하고 관련된 테이블과 그 구조를 설명 할 수 있습니까? –

+0

방금 ​​it.perhaps이 코드는 작동하지 않지만 코드를 모두 작성하고 그 모두를 디버깅 할 수 없습니다. – NDGO

+0

첫 번째 선택은 올바른 데이터 집합을 반환하고 두 번째 부분은 MS SQL을 나타냅니다. – NDGO

답변

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; 

오류 유사한 쿼리 :

Recursive member of a common table expression 'cte' has multiple recursive references.: 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를 한 번 이상 표시 할 수 없습니다. 위의 경우 CTExy으로 앨리어싱되어 있습니다. 이 제한에는 CTE가 생성되지 않고 depth-first이라는 반복과 같은 여러 가지 이유가 있습니다. 당신이 한 번 이상 더 필요 왜 에 대해 생각해야합니까


이다. 귀하의 재귀 부분은 이해가되지 않습니다. recurse 인 경우는 표면에서

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) 

, 다음에 해당하는 실제 테이블 (비 CTE) 행수 생성

  1. count(recurse as [rec1]) x count(recurse as [rec2])이다.
  2. recurse (rec1)의 행은 순환에서 각 행마다 복제되므로 # 1
  3. rec2의 열은 절대로 사용되지 않습니다. rec2는 곱하기 위해서만 사용됩니다.

실행이 허용되면 쿼리의 재귀 부분은 2 차적으로 행 수가 증가하여 끝나지 않습니다.

+0

메시지의 첫 번째 코드 블록 2 개에서 코드를 게시하려고했습니다. 글쎄, SQL 서버는 당신의 코드에 대해 맹세합니다. SQL은 "같은 오류" – NDGO

+0

"이 실행되도록 허용 된 경우 쿼리의 재귀 부분은 행 수가 2 배로 증가하여 끝나지 않습니다." 예,하지만 알고리즘을 가지고 있지만 SQL 제약이 없어이 단계가 없으면 SQL에서이를 인식 할 수 있습니다. – NDGO

+0

바로 그 문장이 바로 다음 문장에서입니다. "오류 : ..."와 설명이 이어졌다. 그것은 단순히 허용되지 않으며, 아직 그러한 구문을 요구했습니다. – RichardTheKiwi