1
커서를 사용했을 때의 문제를 해결하기 위해 CTE와 재귀를 이해하려고합니다.SQL 재귀 CTE : 속성으로 연결된 개체 찾기
create table ##ACC (
AccNo int,
Property char
)
Insert into ##ACC
VALUES (1,'A'),(1,'B'),(2,'A'),(2,'C'),(3,'C'),(4,'D')
내가 달성하고자하는 것은 모든 AccNo의 목록을 얻는 것이며 모든 AccNo는 Property를 통해 관련되어 있습니다. 그래서 내 예상 결과는 내가 다음 코드 및 변형을 시도했습니다
PrimaryAccNo | LinkedAccNo
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
2 | 3
3 | 1
3 | 2
3 | 3
4 | 4
을하지만 나는 하나가 전용 또는 I 100 재귀를 명중 4 개 결과 (PrimaryAccNo = LinkedAccNo) 얻을.
WITH Groups(PrimaryAccNo, LinkedAccNo)
AS
(
Select distinct AccNo, AccNo from ##ACC
UNION ALL
Select g.PrimaryAccNo, p.AccNo from
##ACC p inner join Groups g on p.AccNo=g.LinkedAccNo
inner join ##ACC pp on p.Property=pp.Property
where p.AccNo<> pp.AccNo
)
Select PrimaryAccNo,LinkedAccNo
from Groups
내가 뭘 잘못하고 있니?
디버깅 정보 : CTE의 앵커에 '0으로 심도'를 추가하고 재귀 적으로 '선택'에 '심도 +1'을 추가하십시오. 재귀적인 'where' 절을 추가하여 언제든지 재귀를 중지 할 수 있습니다. '와 Depth <42'를보고 무슨 일이 일어나고 있는지 살펴보십시오. – HABO
@HABO 감사합니다. 나는 이것을 봐야 할 것이다. 지금 나는 이것이 어떻게 나를 돕는 지 보지 못하고있다. – GavinP
나는 모양을 보았다. 불행히도 나는 내 데이터 세트에 대해 얼마나 많은 재귀가 필요한지 알지 못한다. 위 예제에서 'Depth <2'를 사용하여 멋지고 빠르게 실행할 수 있지만 내 실제 데이터 세트에서는 내 쿼리가 실행 중이다. 'Depth <4 '로 13 분 ... ....이 문제는 유일한 새로운 match가 아니라 duplicate가 추가되는 것처럼 보입니다. 나는 커서 기반 접근 방식으로 되돌아 가야 할 것이라고 생각한다. – GavinP