2015-03-17 3 views
1

Я использую иерархию в своей таблице (SQL Server 2008 R2). Я должен найти всех потомков для нескольких узлов. Мой результат родителей выглядит следующим образом:Найти все chlidren для большего количества родителей

| Parent  | 
|:-----------| 
| 0x6CB0AC | 
| 0x6CB180 |   
| 0x6CB181 |  
| 0x6CB141 |   
|   | 

Как я должен написать запрос, который будет возвращать все потомок для каждого из этих родителей?

Дизайн моего стола:

ID: HierarchyId 
Name: varchar(100) 
Surname: varchar(100) 
+1

Используйте рекурсивное ОТВ, как описано здесь: https://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx – NickyvV

+0

Почему рекурсивного CTE? Используйте метод hierarchyid.IsDescendantOf! –

+0

@ JesúsLópez - метод IsDescendantOf работает только на одном узле. Мне нужно найти детей из нескольких узлов - мой результат - это набор данных со многими узлами. – FrenkyB

ответ

2

Предполагая, что имя таблицы дерева, здесь у вас есть запрос:

;WITH P AS 
(
    SELECT CAST(ParentId AS hierarchyid) AS ParentId 
    FROM 
     (VALUES (0x6CB0AC), (0x6CB180)) 
     AS Parents(ParentId) 
) 
SELECT * 
FROM 
    Tree T 
WHERE 
    EXISTS (
     SELECT * 
     FROM P 
     WHERE T.Id.IsDescendantOf(P.ParentId) = 1 
    ) 

EDIT: Я удалил последние две двоичные строки, потому что они не действительны hierarchyid's

EDIT: здесь у вас есть пример, показывающий вас потомками 1.1 и 1.2 с иерархией 0x5AC0 и 0x6AC0.

CREATE TABLE Tree 
(
    Id hierarchyid PRIMARY KEY, 
    Name varchar(100) 

); 


INSERT INTO Tree(Id, Name) VALUES 
('/1/', '1'), 
('/1/1/', '1.1'), 
('/1/1/1/', '1.1.1'), 
('/1/1/2/', '1.1.2'), 
('/2/', '2'), 
('/2/1/', '2.1'), 
('/2/1/1/', '2.1.1'), 
('/2/1/2/', '2.1.2'); 

WITH Ids AS 
(
    SELECT CAST(Id as hierarchyid) AS Id 
    FROM (VALUES (0x5AC0), (0x6AC0)) T(Id) 
) 
SELECT T.* 
FROM 
    Tree T 
WHERE 
    EXISTS (
     SELECT * 
     FROM Ids 
     WHERE T.Id.IsDescendantOf(Ids.Id) = 1 
    ) 

Результат:

+--------+-------+ 
| Id | Name | 
+--------+-------+ 
| 0x5AC0 | 1.1 | 
| 0x5AD6 | 1.1.1 | 
| 0x5ADA | 1.1.2 | 
| 0x6AC0 | 2.1 | 
| 0x6AD6 | 2.1.1 | 
| 0x6ADA | 2.1.2 | 
+--------+-------+ 

Обратите внимание, что IsDescendantOf считают Родитель в качестве своего собственного потомка.

0
Select parent.ID, child.* 
From dbo.YourTable as child 
Join dbo.YourTable as parent 
    On child.HierarchyColumn.IsDescendantOf(parent.HierarchyColumn) = 1