Почему этот CTE действует как счетчик? - PullRequest
0 голосов
/ 23 января 2019

Поведение следующего запроса отличается от моего понимания CTE. Может кто-нибудь уточнить, почему это так?

with cte (n) as
(
    select 1
    union all
    select n + 1 from cte where n<10
)
select * from cte

Я ожидаю следующий вывод:

1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10

Но я получаю:

1,2,3,4,5,6,7,8,9,10

Почему?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Якорь , select 1, вероятно, вас не беспокоит.В результате получается 1.

Рекурсивный запрос select n + 1 from cte where n<10 выполняется многократно для всех новых строк в CTE до тех пор, пока не будут созданы новые строки (или до MaxRecursionдостигнут предел).

Первый раз в единственной новой строке - 1 от привязки, а результат - 2 (n + 1).Теперь есть одна новая строка: 2.Результат: 3.Затем полоскать, повторять до тех пор, пока n<10 не приведет к генерации новых строк.

0 голосов
/ 23 января 2019

CTE - это, по сути, многократно используемый подзапрос, который может ссылаться на себя, поэтому ваш окончательный запрос эквивалентен:

SELECT 1
UNION ALL (SELECT 2 
           UNION ALL (SELECT 3 ...

До тех пор, пока n не достигнет 10.

...