Я просто пытаюсь понять 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-х они связаны с помощью собственности. Так что мои ожидаемые результаты
PrimaryAccNo | LinkedAccNo
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
2 | 3
3 | 1
3 | 2
3 | 3
4 | 4
я попытался следующий код и вариации, но я либо получить 4 результат (PrimaryAccNo = LinkedAccNo) или только я ударил 100 рекурсии.
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
Что я делаю неправильно?
Отладочный наконечник: добавьте '0 в качестве глубины' к якорю в CTE и' Depth + 1' к рекурсивному 'select'. Вы можете остановить рекурсию в любой момент, добавив к рекурсивному предложению 'where', например. 'и Depth <42', и посмотреть, что происходит. – HABO
@HABO спасибо. Мне придется посмотреть на это. Прямо сейчас я не вижу, как это помогает мне. – GavinP
Я посмотрел. К сожалению, я не знаю, сколько рекурсий мне нужно сделать для моего набора данных, поэтому в приведенном выше примере я могу сделать его быстрым и быстрым с помощью 'Depth <2', но на моем реальном наборе данных мой запрос был запущен для 13 минут теперь с 'Depth <4' .... Проблемы, похоже, связаны с добавлением дубликатов, а не только с уникальными новыми совпадениями. Я думаю, что я мог бы просто вернуться к подходу, основанному на курсорах, с которым я бы пошел. – GavinP