Вложенный SQL в одной таблице

#sql #sql-server

Вопрос:

Пожалуйста, ознакомьтесь с данными приведенных ниже таблиц.

Стол Тран

Уникальный Ребенок Родитель
1 40647 40643
2 40645 40644
3 42742 42741
4 40646 40643
5 40643 40642
6 42741 42740
7 40644 40642
8 40643 40642
9 42740 40644
10 40644 40642

Со Стола

Уникальный HProp Уровень
1 40647 70
2 40645 70
3 42742 20
4 40646 70
5 40643 80
6 42741 40
7 40644 80
8 40643 80
9 42740 70
10 40644 80

Ниже приведен SQL, написанный для нескольких соединений с одной и той же таблицей. Есть ли какой-либо другой способ сделать это, потому что вышеуказанные соединения будут продолжаться еще 6 раз. Если я не знаю родительский и дочерний уровни, как мне это автоматизировать ?

Пожалуйста, помогите мне с этим.

 Select
Case when IV.level=80 then IV.Code
     When IV1.level=80 then IV1.Code
     When IV2.level=80 then IV2.Code
     When IV3.level=80 then IV3.Code else '' End as FinalCode,
Case when IV.level=80 then IV.level
     When IV1.level=80 then IV1.level
     When IV2.level=80 then IV2.level
     When IV3.level=80 then IV3.level else '' End as Finallevel
from Offe FD
left join tran FT on FD.Hprop=FT.Child
left join Offe IV on IV.Hprop=FT.Parent  
left join Tran FT1 on FT.Parent=FT1.Child
left join Offe IV1 on FT1.Parent=IV1.OffeID 
left join Tran FT2 on FT1.Parent=FT2.Child
left join Offe IV2 on FT2.Parent=IV2.OffeID 
left join Tran FT3 on FT2.Parent=FT3.Child
left join Offe IV3 on FT3.Parent=IV3.OffeID 
 

Комментарии:

1. Вам нужно использовать rCTE. Выполните поиск решений для иерархических данных в SQL Server.

2. Я использовал вложенный набор en.wikipedia.org/wiki/Nested_set_model путем замены родительского элемента на Левый и правый

Ответ №1:

Вы не включаете конкретный ожидаемый результат, и результат, который вы хотите, неясен из вашего примера. В любом случае, простой рекурсивный CTE будет автоматически «ходить по графику» на нескольких уровнях.

Вероятно, вам потребуется добавить некоторую фильтрацию для выбора определенных строк и некоторую постобработку для отображения/форматирования данных так, как вы хотите, но запрос должен принимать общую форму:

 with
n as (
  select o.level, o.code, t.parent
  from offe o
  join tran t on t.child = o.hprop
 union all
  select o.level, o.code, t.parent
  from n
  join offe o on o.hprop = n.parent
  join tran t on t.child = o.hprop
)
select * from n -- tweak this SELECT as needed