Звучит так, будто вы хотите что-то рекурсивное:
CREATE TABLE d
([ObjectName] varchar(4), [StepName] varchar(13), [StartStep] varchar(13), [EndStep] varchar(10))
;
INSERT INTO d
([ObjectName], [StepName], [StartStep], [EndStep])
VALUES
('Obj1', 'FourthStep', 'FourthStep', NULL),
('Obj1', 'FirstStep', 'FirstStep', 'SecondStep'),
('Obj1', 'NextStep', 'NextStep', 'FourthStep'),
('Obj1', 'SecondStep', 'SecondStep', 'NextStep'),
('Obj2', 'SomethingElse', 'SomethingElse', 'AfterThat')
;
with cte as
(
select 0 as level, objectname, stepname, startstep, endstep from d where endstep is null
union all
select level + 1 as level, d.objectname, d.stepname, d.startstep, d.endstep from d inner join cte on cte.startstep = d.endstep
)
select * from cte order by objectname, level
Надеемся, что для рекурсии не так много шагов, чтобы она превысила возможности SQLS (100 шагов по умолчанию)
Здесь я на самом деле строю дерево в обратном порядке, от последнего шага (конечный шаг равен нулю) обратно к первому, сохраняя счетчик уровня на ходу.Я делаю это потому, что внешнее соединение не разрешено в рекурсивных запросах, и простой способ получить значение NULL в предикате StartStep = EndStep состоит в том, чтобы начать со строки, где EndStep равен NULL, и работать в обратном направлении (поэтому объединение никогда не должно работать сстрока, в которой конечный шаг равен нулю).Сортировка по возрастанию уровня приводит строки в требуемом порядке (любая строка зависит от стиля row-under-it).Если вы сделаете заказ по level desc
, вы увидите их в стиле «порядок работы»
. В этом запросе ваш Obj2 опущен, поскольку он не имеет нулевого конечного шага.Я предполагаю, что это потому, что в вашем вопросе отсутствуют строки obj2