Рекурсия в SQL Server 2008 - PullRequest
       12

Рекурсия в SQL Server 2008

0 голосов
/ 02 марта 2012

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

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

Например,если я передам идентификатор '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 ]

2 голосов
/ 02 марта 2012
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 голосов
/ 02 марта 2012

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

;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
...