Может кто-нибудь объяснить, как получается результат?- CTE SQL Server - PullRequest
0 голосов
/ 13 февраля 2012
with CTE(x) as (
   select x = 1 
   union all 
   select X=X+1 from CTE where x < 4 
   union all 
   select X=X+1 from CTE where x < 4
)
select x from CTE 
GO  

И результат будет.,

x
1
2
2
3
3
4
4
4
4
3
3
4
4
4
4

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Если вы просто поработаете над этим постепенно, это будет довольно просто ...

Во-первых, у вас есть 1.

Затем эта единица создает два СО из СОЮЗОВ, давая 1,2 *, 2 * (звездочки представляют элементы, которые еще не обработаны).

Затем вы обрабатываете одно из 2, чтобы получить 1,2 *, 2,3 *, 3 *. Обратите внимание, что следующий, который я обработал, был самым последним необработанным элементом. Это дает ему подход глубины, а не ширины. Затем серия расширяется по следующим направлениям:

1
1,2*,2*
1,2*,2,3*,3*
1,2*,2,3*,3,4,4
1,2*,2,3,3,4,4,4,4
1,2,2,3,3,4,4,4,4,3*,3*
1,2,2,3,3,4,4,4,4,3*,3,4,4
1,2,2,3,3,4,4,4,4,3,3,4,4,4,4

Четверки никогда не нужно обрабатывать, поэтому не ставьте * отметку.

1 голос
/ 13 февраля 2012

select x = 1

называется элементом привязки.Это ваша база для рекурсивного вызова (как указал Алекс К., это рекурсивный CTE).

2 двойки исходят от рекурсивных членов

select X=X+1 from CTE where x < 4 
union all 
select X=X+1 from CTE where x < 4

, вызываемых наякорь 1. Четыре 3 идут от рекурсивных членов, вызываемых на два 2, и, наконец, 8 четверки приходят от рекурсивных членов, вызываемых на четыре тройки.

И оттуда он останавливается из-засостояние

x < 4
0 голосов
/ 13 февраля 2012

Выберите 1.

Возьмите выбранное значение (1), добавьте 1 и объедините его с выбранным значением плюс 1. (2, 2)

Возьмите две только что добавленные строки (2, 2) и повторите. (3, 3)

...

«Четверо - прямо».

...