С использованием рекурсивной функции без труда сделал запрос:
if not object_id('VEHICLE_TREE_TEST') is null
drop table VEHICLE_TREE_TEST
go
create table VEHICLE_TREE_TEST (
VTR_NODE_ID int NOT NULL PRIMARY KEY,
VTR_PARENT_NODE_ID int NULL DEFAULT (null)
)
insert into VEHICLE_TREE_TEST (VTR_NODE_ID, VTR_PARENT_NODE_ID)
select 100, null union
select 101, 100 union
select 103, 101 union
select 104, 101 union
select 105, 104 union
select 102, 100 union
select 106, 102 union
select 108, 106 union
select 107, 102
go
if not object_id('GetChildsTemp') is null
drop function GetChildsTemp
go
create function GetChildsTemp(@prnt as int)
returns varchar(4000)
as
begin
declare @PKCols varchar(4000), @chld int
set @PKCols = ''
select @PKCols = coalesce(@PKCols, N'') + N',' + cast(VTR_NODE_ID as varchar)
from VEHICLE_TREE_TEST
where VTR_PARENT_NODE_ID = @prnt
declare cur cursor
for
select VTR_NODE_ID
from VEHICLE_TREE_TEST (nolock)
where VTR_PARENT_NODE_ID = @prnt
open cur
FETCH NEXT FROM cur into @chld
WHILE (@@FETCH_STATUS = 0)
BEGIN
set @PKCols = @PKCols + dbo.GetChildsTemp(@chld)
FETCH NEXT FROM cur into @chld
END
CLOSE cur
DEALLOCATE cur
return @PKCols
end
go
select VTR_NODE_ID as [Root], case when len(List) = 0 then List else right(List, len(List) - 1) end as List
from (
select VTR_NODE_ID, dbo.GetChildsTemp(VTR_NODE_ID) as List
from VEHICLE_TREE_TEST ) as T
И получил, то, что и требовалось по ТЗ:
Root List
100 101,102,103,104,105,000,000,000
101 103,104,105
102 106,107,108
103
104 105
105
106 108
107
108
Пытался сделать запрос в терминах SQL Server 2005 с использованием cte, но, к сожалению, ничего не вышло.
Покажите, как это можно сделать
Спасибо!