2012-03-02 16 views
0

select * from MyTable дает следующий результат, enter image description hereрекурсии в SQL Server 2008

Теперь я хотел бы получить идентификаторы всех Чайлдс, если я прохожу идентификатор «Сундук».

Например, если я прохожу идентификатор «ChestOne», я хотел бы получить со следующей таблицей

enter image description here

Я попытался следующие, но не мог получить результат

;WITH Temp_CTE AS 
(
SELECT 
    id 
    ,name 
    ,parent_id 
FROM dbo.MyTable 
WHERE id = '12D390AE-FF28-4D50-B3A2-A6CC4E6E02A9' 
UNION ALL 
SELECT 
    CS.id 
    ,CS.name 
    ,CS.parent_id 
FROM dbo.MyTable CS 
INNER JOIN Temp_CTE ON CS.id = Temp_CTE.parent_id 

) 
SELECT * FROM Temp_CTE 

Как это сделать в SQL Server 2008?

+2

Попробуйте изменить ваш присоединиться вокруг. 'INNER JOIN Temp_CTE ON CS.parent_id = Temp_CTE.id' –

ответ

2
declare @MyTable table 
(
    id char(2), 
    name varchar(10), 
    parent_id char(2) 
) 

insert into @MyTable values 
('54', 'Chest Two', '12'), 
('CD', 'InCOne', '6D'), 
('6D', 'ChestOne', '12'), 
('12', 'Chest', '00') 

;WITH Temp_CTE AS 
(
SELECT 
    id 
    ,name 
    ,parent_id 
FROM @MyTable 
WHERE id = '6D' 
UNION ALL 
SELECT 
    CS.id 
    ,CS.name 
    ,CS.parent_id 
FROM @MyTable CS 
INNER JOIN Temp_CTE ON CS.parent_id = Temp_CTE.id 

) 
SELECT * FROM Temp_CTE 

Результат:

id name  parent_id 
---- ---------- --------- 
6D ChestOne 12 
CD InCOne  6D 
2

Я думаю, что это должно быть:

;WITH Temp_CTE AS 
(
SELECT 
    id 
    ,name 
    ,parent_id 
FROM dbo.MyTable 
WHERE id = '12D390AE-FF28-4D50-B3A2-A6CC4E6E02A9' 
UNION ALL 
SELECT 
    CS.id 
    ,CS.name 
    ,CS.parent_id 
FROM dbo.MyTable CS 
INNER JOIN Temp_CTE ON CS.parent_id = Temp_CTE.id 

) 
SELECT * FROM Temp_CTE