Комментарии по теме

«Ре­ко­ме­нда­ции по обе­спе­че­нию бе­зо­па­сно­сти и контроля SAP HANA»
Дмитрий Буслов:
(1) Автор начинает с того, что HANA — это СУБД, позволяющая хранить записи в колонках и работающая в оперативной памяти. Я бы, хотел сделать акцент на том, что HANA — не просто СУБД,...
«Различие между двумя текущими версиями HANA»
Олег Точенюк:
Спасибо конечно... я вот не понимаю как консалт выживает в этом мире, когда есть такой чудесный традиционный сайт help.sap.com/ :-)
«Упрощаем работу с ADBC»
Леонид Мартынов:
Спасибо за отзыв!   Я согласен для HANA актуальна  HANA studio. Но я имел опыт с тем, что например доступ к ней разработчик по каким-либо причинам не имеет, а новый Open SQL не поддерживает...

Псевдо-рекурсивный SQL в HANA, или собственный способ формирования иерархий


1490

Введение

Не так давно я просматривал в очередной раз актуальный (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
                                        

Ограниченный доступ

Для прочтения полной версии статьи необходимо зайти как зарегистрированный пользователь.

Ключевые слова: SAP HANA
Функциональная область: SAP HANA / SAP HANA
Ролевое назначение: SAP Консультант / Consultant

Любое воспроизведение запрещено.
Копирайт © «Издательство ООО «Эксперт РП»