Меню

Псевдо-рекурсивный 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

У вас уже есть учетная запись?

Войти