SQL выбирает все строки в «истории» одной строки - PullRequest
0 голосов
/ 30 октября 2019

У меня есть таблица, которая выглядит следующим образом:

ID | PARENT_ID
--------------
0  | NULL
1  | 0
2  | NULL
3  | 1
4  | 2
5  | 4
6  | 3

Будучи нубом SQL, я не уверен, что смогу выполнить то, что хотел бы, одной командой.

Я хотел бы начать с строки 6 и рекурсивно следовать «истории», используя столбец PARENT_ID для ссылки на столбец идентификатора.

Результат (по моему мнению) должен выглядеть примерно так:

6|3
3|1
1|0
0|NULL

Я уже пробовал что-то вроде этого:

SELECT T1.ID 
FROM Table T1, Table T2 
WHERE T1.ID = 6 
   OR T1.PARENT_ID = T2.PARENT_ID;

, но это просто дало мне странный результат.

1 Ответ

0 голосов
/ 30 октября 2019

С recursive cte. Если вы хотите начать с максимума id:

with recursive cte (id, parent_id) as (
  select t.*
  from (
    select *
    from tablename
    order by id desc
    limit 1
  ) t
  union all
  select t.*
  from tablename t inner join cte c
  on t.id = c.parent_id
)  

select * from cte

См. Демоверсию . Если вы хотите начать именно с id = 6:

with recursive cte (id, parent_id) as (
  select *
  from tablename
  where id = 6
  union all
  select t.*
  from tablename t inner join cte c
  on t.id = c.parent_id
)
select * from cte; 

См. Демоверсию . Результаты:

| id  | parent_id |
| --- | --------- |
| 6   | 3         |
| 3   | 1         |
| 1   | 0         |
| 0   |           |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...