Ich habe zwei Tabellen, ticket
und problem
. Jedes Ticket hat ein Problem und jedes Problem kann ein Elternproblem haben oder nicht. Beispieldaten:Verwenden eines CTE zum Auflisten der Eltern als Spalten
create table #problem (problem_type_id int, problem_type_name varchar(32), parent_id int)
insert #problem
select 1, 'Change Request', NULL union
select 5, 'Level 1', 1 union
select 10, 'Software', 5 union
select 15, 'Applications', 10 union
select 20, 'Update', 15 union
select 6, 'Level 2', 1 union
select 11, 'Hardware', 6 union
select 16, 'Install', 11
create table #ticket (ticket_id int, problem_type_id int)
insert #ticket
select 1, 20 union
select 2, 16
Hier ist das Ergebnis, das ich brauche:
+-----------+-----------------+-----------------+-----------------+-----------------+-----------------+
| ticket_id | problem_level_1 | problem_level_2 | problem_level_3 | problem_level_4 | problem_level_5 |
+-----------+-----------------+-----------------+-----------------+-----------------+-----------------+
| 1 | Change Request | Level 1 | Software | Applications | Update |
| 2 | Change Request | Level 2 | Hardware | Install | |
+-----------+-----------------+-----------------+-----------------+-----------------+-----------------+
Unter der Annahme, dass es höchstens vier Nachkommen von einem Top-Level-Eltern sein wird, wie kann ich die Probleme in der umgekehrten Reihenfolge erhalten mit der oberste Elternteil zuerst? Hier ist, was ich bisher:
;with probs (parent_id, problem_type_id, problem_type_name, level)
as
(
-- anchor member definition
select parent_id, problem_type_id, problem_type_name, 0 as level
from #problem
where parent_id is null
union all
-- recursive member definition
select a.parent_id, a.problem_type_id, a.problem_type_name, level + 1
from #problem a
join probs as b on b.problem_type_id = a.parent_id
)
select t.ticket_id,
p1.level, /* p1.problem_type_id, */ p1.problem_type_name,
p2.level, /* p2.problem_type_id, */ p2.problem_type_name,
p3.level, /* p3.problem_type_id, */ p3.problem_type_name,
p4.level, /* p4.problem_type_id, */ p4.problem_type_name,
p5.level, /* p5.problem_type_id, */ p5.problem_type_name
from #ticket t
join probs p1 on p1.problem_type_id = t.problem_type_id
left join probs p2 on p2.problem_type_id = p1.parent_id and p2.level = p1.level - 1
left join probs p3 on p3.problem_type_id = p2.parent_id and p3.level = p2.level - 1
left join probs p4 on p4.problem_type_id = p3.parent_id and p4.level = p3.level - 1
left join probs p5 on p5.problem_type_id = p4.parent_id and p5.level = p4.level - 1
order by t.ticket_id
Ich kann nicht scheinen, um herauszufinden, wie die Ebene 0 Spalten zuerst erhalten, dann die Kinder.