2013-10-11 3 views
1

Учитывая следующую структуру таблицы:Как получить всех потомков узла

CREATE TABLE [dbo].[NodeTest] (
[Id]    INT   IDENTITY (1, 1) NOT NULL, 
[NodeCode]  NVARCHAR (50) NOT NULL, 
[ParentNodeCode] NVARCHAR (50) NULL, 
[NodeName]  NVARCHAR (255) NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

И следующие данные:

insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('0', null, 'ROOT') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('01', '0', '01') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('02', '0', '02') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('03', '0', '03') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('011', '01', '011') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('012', '01', '012') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('021', '02', '021') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('022', '02', '022') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('023', '02', '023') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('024', '02', '024') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('025', '02', '025') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('031', '03', '031') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('032', '03', '032') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('0111', '011', '0111') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('0112', '011', '0112') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('0311', '031', '0311') 
insert into NodeTest(NodeCode, ParentNodeCode, NodeName) values('0322', '032', '0322') 

Как я могу написать представление для вывода списка узлов с их всех потомков? Например, для узла 01 I получит:

01 011 
01 012 
01 0111 
01 0112 

Используйте этот SQLFiddle, которая содержит таблицу и информацию, представленную выше.

ответ

2

Используя выражение общей таблицы (КТР)

declare @parentCode varchar(20) = '01' 

;with cte as 
(
    select * from NodeTest where ParentNodeCode = @parentCode 
    union all 
    select NodeTest.* 
    from NodeTest 
     inner join cte on cte.NodeCode = nodeTest.ParentNodeCode 
) 
select @parentCode, nodeCode from cte; 
+0

+1 еще, если SO разрешит это. –

3

Работа SQLFiddle

Я думаю, что вы хотите, это

with cte as 
    (
     select * from NodeTest where ParentNodeCode = '01' 
     union all 
     select NodeTest.* 
     from NodeTest 
     inner join cte on cte.NodeCode = NodeTest.ParentNodeCode 
    ) 
    select * from cte; 
+0

Что такое 'compartments' в запросе? –

+0

@RaduGheorghiu жаль, что это была моя ошибка – Dhaval

0

В приведенной ниже запрос должен сделать трюк, в основном вы должны присоединиться к столу обратно к себе, чтобы создать отношения родитель-ребенок и присоединиться на Parents.NodeCode с Childs.ParentNodeCode

SELECT 
    P.NodeCode, 
    C.NodeCode AS ChildNodeCode 
FROM 
    NodeTest P 
INNER JOIN 
    NodeTest C 
ON 
    P.NodeCode = C.ParentNodeCode 
+0

Это не так. Попробуйте запустить его в этом SQLFiddle http://sqlfiddle.com/#!3/d7eb0 –

+0

@RaduGheorghiu он не работает в SQLfiddle, потому что я не помечал столбцы по-разному. запрос правильный. –

+0

Это то, что возвращает ваш запрос: http://sqlfiddle.com/#!3/d7eb0/18, который не совпадает с ожидаемым результатом. –

0

это будет работать

выберите a.NodeCode, b.NodeName из NodeTest внутреннее соединение NodeTest б на a.NodeName = b.ParentNodeCode

Смежные вопросы