Рекурсивный выбор в SQL
У меня проблема, я просто не могу разобраться. Я знаю, чего хочу, просто не могу вывести это на экран. У меня есть таблица, похожая на эту:
Id, PK UniqueIdentifier, NotNull
Name, nvarchar(255), NotNull
ParentId, UniqueIdentifier, Null
У ParentId есть FK для идентификатора.
То, что я хочу сделать, это получить список всех идентификаторов ниже идентификатора, который я передаю.
пример:
1 TestName1 NULL
2 TestName2 1
3 TestName3 2
4 TestName4 NULL
5 TestName5 1
Дерево будет выглядеть так:
-1
-> -2
-> -3
-> -5
-4
Если бы я теперь попросил 4, я бы получил только 4 назад, но если бы я попросил 1, я бы получил 1, 2, 3 и 5. Если я попрошу 2, я получу 2 и 3 и так далее.
Есть ли кто-нибудь, кто может указать мне в правильном направлении. Мой мозг зажарен, поэтому я ценю любую помощь, которую могу получить.
5 ответов
declare @T table(
Id int primary key,
Name nvarchar(255) not null,
ParentId int)
insert into @T values
(1, 'TestName1', NULL),
(2, 'TestName2', 1),
(3, 'TestName3', 2),
(4, 'TestName4', NULL),
(5, 'TestName5', 1)
declare @Id int = 1
;with cte as
(
select T.*
from @T as T
where T.Id = @Id
union all
select T.*
from @T as T
inner join cte as C
on T.ParentId = C.Id
)
select *
from cte
Результат
Id Name ParentId
----------- -------------------- -----------
1 TestName1 NULL
2 TestName2 1
5 TestName5 1
3 TestName3 2
Вот рабочий пример:
declare @t table (id int, name nvarchar(255), ParentID int)
insert @t values
(1, 'TestName1', NULL),
(2, 'TestName2', 1 ),
(3, 'TestName3', 2 ),
(4, 'TestName4', NULL),
(5, 'TestName5', 1 );
; with rec as
(
select t.name
, t.id as baseid
, t.id
, t.parentid
from @t t
union all
select t.name
, r.baseid
, t.id
, t.parentid
from rec r
join @t t
on t.ParentID = r.id
)
select *
from rec
where baseid = 1
Вы можете фильтровать по baseid
, который содержит начало дерева, к которому вы обращаетесь.
Попробуй это:
WITH RecQry AS
(
SELECT *
FROM MyTable
UNION ALL
SELECT a.*
FROM MyTable a INNER JOIN RecQry b
ON a.ParentID = b.Id
)
SELECT *
FROM RecQry
Вот хорошая статья о моделях Hierarchy ID. Он идет с самого начала данных до проектирования запросов.
Кроме того, вы можете использовать рекурсивный запрос, используя общее табличное выражение.
Я предполагаю, что самый простой способ выполнить то, что вы ищете, это написать рекурсивный запрос с использованием выражения Common Table Expression:
MSDN - Рекурсивные запросы с использованием общих табличных выражений