#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