Предполагая, что имя таблицы дерева, здесь у вас есть запрос:
;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 считают Родитель в качестве своего собственного потомка.
Используйте рекурсивное ОТВ, как описано здесь: https://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx – NickyvV
Почему рекурсивного CTE? Используйте метод hierarchyid.IsDescendantOf! –
@ JesúsLópez - метод IsDescendantOf работает только на одном узле. Мне нужно найти детей из нескольких узлов - мой результат - это набор данных со многими узлами. – FrenkyB