Псевдо-рекурсивный SQL в HANA, или собственный способ формирования иерархий
Введение
Не так давно я просматривал в очередной раз актуальный (SP 8) мануал по HANA и наткнулся на упоминание, что рекурсия с оператором WITH не работает – Рис.1.
Рис.1
С WITH не работает. Но как-то по-другому, наверное, можно добиться рекурсивного вызова?!
Те, кто использовал SAP HANA ещё в rev. 32 возможно помнят про существование недокументированной возможности:
SELECT … START WITH … CONNECT BY …= PRIOR …
Видимо, как раз на этот вариант ссылаются в документации.
Можно!
Первое что я сделал – это вспомнил про варианты «гибкого результата». Это когда на вход процедуры подаётся флаг, и она возвращает результат в зависимости от значения флага:
If :flag>0 then
var_out = select …
Else
var_out = select …
End if;
Следующим шагом был вопрос присваивания:
var_out=select * from :var_out;
Такой вариант тоже прошел. Вот она, рекурсия! Осталось только добавить вычисление или объединение и всё. Самый простой вариант, где возможно применение рекурсии – иерархия.
Пусть дана таблица Рис.2., требуется найти уровень Parent-Child иерархии.
Рис.2.
Для этого необходимо left-join -ом присоединять таблицу саму к себе до тех пор, пока не будут найдены все уровни. Выглядеть это может примерно так:
flag1:=1;--выход из цикла
while flag1>0 do
--максимальный уровень до расчёта следующего
var_n = select max(c) as c from :var_tab;
var_tab = select a.q,a.w,a.c as c
from :var_tab as a
left join :var_tab as q on
a.q=q.w
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти