Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / нестандартные рекурсивные CTE - почему ТАК? / 5 сообщений из 5, страница 1 из 1
21.09.2018, 13:22
    #39706088
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартные рекурсивные CTE - почему ТАК?
Теоретически ничто в рекурсивном CTE не запрещает иметь более 2 субзапросов. Попробовал использовать это - и наткнулся на непонимание, как вообще выполняется CTE. В частности, я не понимаю логики порядка исполнения.

Вот модель:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
mysql> WITH RECURSIVE cte
    -> AS
    -> (
    -> SELECT @id:=1 id,2 num
    -> UNION ALL
    -> SELECT @id:=@id+1, num+2
    -> FROM cte
    -> WHERE num < 7
    -> UNION ALL
    -> SELECT @id:=@id+1, num * 10 - 5
    -> FROM cte
    -> WHERE num < 20
    -> )
    -> SELECT *
    -> FROM cte;
+------+------+
| id   | num  |
+------+------+
|    1 |    2 |
|    2 |    4 |
|    3 |    6 |
|    4 |    8 |
|    5 |   15 |
|    6 |   35 |
|    7 |   55 |
|    8 |   75 |
|    9 |  145 |
+------+------+
9 rows in set (0.00 sec)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
mysql> WITH RECURSIVE cte
    -> AS
    -> (
    -> SELECT @id:=1 id,2 num
    -> UNION -- ALL
    -> SELECT @id:=@id+1, num+2
    -> FROM cte
    -> WHERE num < 7
    -> UNION -- ALL
    -> SELECT @id:=@id+1, num * 10 - 5
    -> FROM cte
    -> WHERE num < 20
    -> )
    -> SELECT *
    -> FROM cte;
+------+------+
| id   | num  |
+------+------+
|    1 |    2 |
|    2 |    4 |
|    3 |   15 |
|    4 |    6 |
|    5 |   35 |
|    6 |  145 |
|    7 |    8 |
|    8 |   55 |
|    9 |   75 |
+------+------+
9 rows in set (0.00 sec)


В документации ничего вменяемого не нашёл...
...
Рейтинг: 0 / 0
21.09.2018, 13:24
    #39706089
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартные рекурсивные CTE - почему ТАК?
PS. Это я ещё не говорил о случае, когда первый субзапрос - выборка из таблицы, а не статика... и уж совсем тёмный лес, когда перемешаны UNION ALL и UNION DISTINCT...
...
Рейтинг: 0 / 0
23.09.2018, 00:22
    #39706482
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартные рекурсивные CTE - почему ТАК?
Логика следующая:

-) создается исходный набор строк S0.
В примере это будет одна строка (1,2)
-) на основании S0 создается новый набор строк S1 - (2,4),(3,15)
-) на основании S1 создается новый набор строк S2 - (4,6),(5,35),(6,145)
-) на основании S2 создается новый набор строк S3 - (7,8),(8,55)
-) на основании S3 создается новый набор строк S4 - (9,75)
-) слияние промежуточных наборов S0, … S4 результат чего и виден и итоговом обращении к cte

В своей интерпретации, я на каждую строку предыдущего набора действовал сначала первой рекурсивной частью, потом второй. Но дока прямо говорит, что при наличии нескольких блоков в рекурсивной части порядок их применения не определен.
Each iteration of the recursive part operates only on the rows produced by the previous iteration. If the recursive part has multiple query blocks, iterations of each query block are scheduled in unspecified order, and each query block operates on rows that have been produced either by its previous iteration or by other query blocks since that previous iteration's end.

Глядя на первый пример, можно предположить, что:
а) сначала были сформированы наборы
S0: (1,2)
S1: (2,4)
S2: (3,6)
S3: (4,8)
путем применения первой части рекурсивного запроса
б) затем они дополнялись:
к S1 + (5,15)
к S2 + (6,35)
к S3 + (7,55)
сформирован S4 (8,75)
в) вернулись назад и дополняем наборы на основании новых строк, в итоге добавится только одна строка в S2 (9,145).

Вывод: использование пользовательских переменных в данном контексте некорректно, так как результат будет зависеть от плана выполнения запроса.
...
Рейтинг: 0 / 0
24.09.2018, 08:01
    #39706757
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартные рекурсивные CTE - почему ТАК?
retvizanВывод: использование пользовательских переменных в данном контексте некорректно, так как результат будет зависеть от плана выполнения запроса.Ну тут скорее наоборот, поскольку переменная используется именно для определения реального порядка выполнения.

retvizan each query block operates on rows that have been produced either by its previous iteration or by other query blocks since that previous iteration's end . Вот над этой фразой надо долго думать... пока навскидку мне кажется, что тут может быть потенция потери записей, потому что блоки обрабатываются в общем случае последовательно... т.е. теоретически, если верить ЭТОЙ фразе, то записи, произведённые последним блоком на предыдущей итерации, не будут обрабатываться другими блоками на текущей итерации, потому как не подпадают ни под одно из двух данных тут определений.
...
Рейтинг: 0 / 0
24.09.2018, 11:21
    #39706851
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартные рекурсивные CTE - почему ТАК?
Akinaretvizan each query block operates on rows that have been produced either by its previous iteration or by other query blocks since that previous iteration's end . Вот над этой фразой надо долго думать... пока навскидку мне кажется, что тут может быть потенция потери записей, потому что блоки обрабатываются в общем случае последовательно... т.е. теоретически, если верить ЭТОЙ фразе, то записи, произведённые последним блоком на предыдущей итерации, не будут обрабатываться другими блоками на текущей итерации, потому как не подпадают ни под одно из двух данных тут определений.
Я перевел эту фразу как:
каждый блок запроса работает со строками, которые были созданы его предыдущей итерацией (т.е. итерацией конкретного блока) или другими блоками запроса с момента окончания предыдущей итерации (итерации того самого конкретного блока) .

Т.е. при наличии более одного блока каждый может вызываться несколько раз, чтобы обработать все строки из предыдущего промежуточного набора.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / нестандартные рекурсивные CTE - почему ТАК? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]