< Сильный > Таблица:

+-----+------------+-------------+
| 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')
0
SamuraiJack 6 Май 2020 в 18:14

2 ответа

Лучший ответ

Просто незначительный поворот в ответе Гордона (уже +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
0
John Cappelletti 6 Май 2020 в 15:31

Вы хотите рекурсивный 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 cte.documentno = bd.ParentCCID
     )
select bd.documentno
from cte;
1
Gordon Linoff 6 Май 2020 в 15:16