Итеративный SQL-запрос - PullRequest
       9

Итеративный SQL-запрос

0 голосов
/ 15 декабря 2018

У меня сложное требование с двоичным деревом

Вот так выглядят мои данные

ID     IDNEXT
1A       2E
3D       4A
2E       6F
6F       3D
4A       

Мой OutPut должен быть в этом фашине

ID     IDNEXT
1A      2E
2E      6F
6F      3D
3D      4A
4A 

Исходя из текущего IDNEXT, я должен идентифицировать mynext, и мы должны продолжать в том же духе до конца, а глубина неизвестна

Любые предложения

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Как упоминалось в моем комментарии, SAP HANA предоставляет Hierarchy-Functions , которые обеспечивают очень эффективную обработку данных иерархии, которые были закодированы в таблицах с помощью схемы "узел" / "родительский узел".

Требование этого вопроса можно сформулировать так: "пройти направленный граф в глубину и вернуть посещенные узлы в порядке посещения" .

С помощью функций иерархииэто легко сделать:

create column table con (ID nvarchar(2) not null
                       , IDNEXT nvarchar(2) not null);
/*
ID     IDNEXT
1A       2E
3D       4A
2E       6F
6F       3D
4A
*/

insert into con values ('1A', '2E');
insert into con values ('3D', '4A');
insert into con values ('2E', '6F');
insert into con values ('6F', '3D');
insert into con values ('4A', '');

SELECT   
     hierarchy_rank AS rank,
     node_id,
     parent_id
FROM HIERARCHY (
    SOURCE (SELECT  ID  as "NODE_ID"
                  , IDNEXT as "PARENT_ID" 
            FROM con)
    START WHERE IDNEXT =''
    )
ORDER BY
    hierarchy_rank desc;

/*
RANK    NODE_ID PARENT_ID
5       1A      2E       
4       2E      6F       
3       6F      3D       
2       3D      4A       
1       4A               
*/

Этот подход выигрывает от

  • выразительности того, как иерархия создается на основе данных таблицы и какие вычисления должны выполняться с иерархией
  • эффективная (как в пространстве, так и во времени) реализация обработки иерархии в SAP HANA вместо эмуляции функциональности через функции SQL.Это особенно удобно, когда необходимо повторно использовать ту же иерархию, поскольку структура автоматически кэшируется.

Самое большое препятствие с этими специальными функциями, вероятно, заключается в том, что им необходимо точно думать оиерархия / график, который вы хотите определить.К счастью, SAP HANA Academy предоставляет несколько учебных пособий видео , которым нужно следовать.

0 голосов
/ 15 декабря 2018

Я не знаком с Hana, но в стандартном SQL вы можете использовать рекурсивное CTE (общие табличные выражения).

Следующий пример был протестирован с PostgreSQL:

CREATE TABLE links(id VARCHAR(10), idnext VARCHAR(10));

INSERT INTO links(id, idnext) values('1a','2e'), ('3d','4a'), ('2e','6f'), ('6f', '3d');

WITH RECURSIVE cte AS (
  SELECT id, idnext FROM links WHERE id='1a'   -- the first node  
  UNION ALL    
  SELECT links.id, links.idnext 
    FROM links  
    JOIN cte 
    ON  links.id = cte.idnext
) 
SELECT * FROM cte;

Результат:

 id | idnext 
----+--------
 1a | 2e
 2e | 6f
 6f | 3d
 3d | 4a
...