Реализация рекурсивного CTE для иерархического запроса к MariaDB - PullRequest
0 голосов
/ 28 января 2019

У меня есть эта таблица, в которой я хотел бы хранить цепочку записей.

CREATE TABLE table_name (
    id INT,
    unique_id varchar,
    reference_id varchar,
);

Я хочу реализовать SQL-запрос для MariDB, который печатает все записи по unique_id со всеми записями reference_id.Примерно так:

| id | unique_id | reference_id |   |   |
|----|-----------|--------------|---|---|
| 43 | 55544     |              |   |   |
| 45 | 45454     | 43           |   |   |
| 66 | 55655     | 45           |   |   |
| 78 | 88877     | 66           |   |   |
| 99 | 454       | 33           |   |   |

Я бы хотел, чтобы я выбрал запись 55544, чтобы получить все транзакции, потому что друг друга используют id, который указывает на них.Как я могу реализовать это с помощью рекурсивного CTE?Есть ли лучший способ?

Ожидаемый результат для записи с unique_id 55544:

| id | unique_id | reference_id |   |   |
|----|-----------|--------------|---|---|
| 43 | 55544     |              |   |   |
| 45 | 45454     | 43           |   |   |
| 66 | 55655     | 45           |   |   |
| 78 | 88877     | 66           |   |   |

Как этот запрос может быть реализован также в HQL?Я хочу использовать его в JPA?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете использовать рекурсивный CTE.Это правильный способ сделать это:

with recursive cte as (
      select t.*
      from table_name t
      where t.unique_id = 55544
      union all
      select t.*
      from cte join
           table_name t
           on cte.id = t.reference_id
     )
select *
from cte;
0 голосов
/ 28 января 2019

Следующий запрос должен делать то, что вы ожидаете.Это рекурсивный запрос, который опирается на переменную, которая следует за отношениями родитель-потомок через дерево зависимостей.

select @ref:=id as id, unique_id, reference_id
from mytable
join (select @ref:=id from mytable WHERE unique_id = 55544)tmp
where reference_id=@ref

Эта демонстрация на DB Fiddle приводит к:

| id  | unique_id | reference_id |
| --- | --------- | ------------ |
| 45  | 45454     | 43           |
| 66  | 55655     | 45           |
| 78  | 88877     | 66           |

PS: обратите внимание, что это не возвращает верхнюю родительскую строку.Если вам это также нужно, вы можете изменить условие WHERE на:

where reference_id=@ref or unique_id = 55544
...