SQL запрос для получения списка всех записей, находящихся выше в иерархии - PullRequest
0 голосов
/ 06 мая 2020

Таблица:

+-----+------------+-------------+
| Id  | DocumentNo | ParentCCID  |
+-----+------------+-------------+
|  10 | CC001      | NULL        |
|  20 | CC002      | CC001       |
|  33 | CC003      | CC002       |
+-----+-------------+-------------+

Значение, переданное в запрос: CC003

Ожидаемый результат:

CC003
CC002
CC001

Неудачная попытка:

select b2.documentno,b2.ParentCCID  from basicdetails  b1 
inner join basicdetails b2 on b1.documentno = b2.ParentCCID 
where b2.documentno='CC003' 

Примечание: DocumentNo - уникальный первичный ключ. ParentCCID может иметь нулевые значения, если родительская запись отсутствует.

EDIT:

create table basicdetails2
  (
    id int identity,
    documentno varchar(30),
    parentccid varchar(30)
  )
    insert into basicdetails2 values('CC001', null)
    insert into basicdetails2 values('CC002', 'CC001')
    insert into basicdetails2 values('CC003', 'CC002')
    insert into basicdetails2 values('CC004', 'CC003')

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вам нужен рекурсивный cte:

with cte as (
      select bd.documentno, bd.ParentCCID
      from basicdetails bd
      where bd.documentno = 'CC003'
      union all
      select cte.documentno, cte.ParentCCID
      from cte join
           basicdetails bd
           on bd.documentno = cte.ParentCCID
     )
select bd.documentno
from cte;
0 голосов
/ 06 мая 2020

Небольшой поворот в ответе Гордона (уже +1).

Мне нравится отслеживать уровень и видеть родителей для каждой записи

Пример

Declare @Fetch varchar(25) = 'CC003'

;with cte as (
      Select DocumentNo
            ,ParentCCDocumentNo
            ,Lvl=1
      From   YourTable 
      Where  DocumentNo=@Fetch
      Union  All
      Select R.DocumentNo
            ,R.ParentCCDocumentNo
            ,P.Lvl+1
      From   YourTable R
      Join   cte P on P.ParentCCDocumentNo = R.DocumentNo)
Select Lvl = Row_Number() over (Order By Lvl Desc)
      ,DocumentNo
      ,ParentCCDocumentNo
From cte
Order By 1 desc

Возврат

Lvl DocumentNo  ParentCCDocumentNo
3   CC003       CC002
2   CC002       CC001
1   CC001       NULL
...