2009-10-22 3 views
2
id parent_id 
1 0 
2 0 
3 2 
4 0 
5 1 
6 0 

Мне нужен запрос, который будет возвращать родительские строки (parent_id = 0), а затем его дочерние строки:Родитель - Ребенок SQL запрос

  1. первым родителем
  2. все дети первого родителя
  3. второй родитель
  4. всех дети второго родителя
  5. третий родитель
  6. четвертых Родитель

Ожидаемый результат: упорядоченный по идентификатору

id parent_id 
------------------------------------------- 
1 0 (first parent) 
5 1  (all children of first parent) 
2 0 second parent 
3 2  (all children of second parent) 
4 0 third parent 
6 0 fourth parent 

я могу использовать объединение родителей, после чего все Чайлдс Но это дает мне родители сначала тогда дети. Мне нужен родитель и сразу его дети.

Любой может помочь?

+0

Что вы используете? –

+0

Я использую SQL Server 2005 – kheya

ответ

0

Это может быть достигнуто с помощью двух временных таблиц и трех переменных.

 
CREATE TABLE #Parents 
(
RowId bigint identity(1,1), 
Id bigint 
)

CREATE TABLE #Results ( RowId bigint identity(1,1), Id bigint, ParentId bigint )

DECLARE @Count1 bigint DECLARE @Count2 bigint DECLARE @ParentId bigint

INSERT INTO #Parents SELECT Id FROM MyTable WHERE ParentId = 0 ORDER BY Id

SET @Count1 = 0 SELECT @Count2 = MAX(RowId) FROM #Parents

WHILE @Count1 < @Count2 BEGIN SET @Count1 = @Count1 +1 SELECT @ParentId = Id FROM #Parents WHERE RowId = @Count1 INSERT INTO #Results (Id, ParentId) VALUES (@Count1, 0) INSERT INTO #Results (Id, ParentId) SELECT ID, ParentId FROM MyTable WHERE ID = @Count1 ORDER BY Id END

SELECT Id, ParentId FROM #Results ORDER BY RowId

DROP TABLE #Results DROP TABLE #Parents

3

Если вы работаете в SQL Server 2005+, вы можете использовать рекурсивный CTE, убедившись, что вы поддерживаете поле, которое вы можете заказать в конце.

Попробуйте это:

declare @t table (id int, parent_id int) 
insert @t 
select 1,0 
union all select 2,0 
union all select 3,2 
union all select 4,0 
union all select 5,1 
union all select 6,0 
; 

with tree as (
select t.*, convert(varbinary(max),t.id) as ordered 
from @t t 
where parent_id = 0 
union all 
select t.*, ordered + convert(varbinary(max),t.id) 
from tree base 
join 
@t t 
on t.parent_id = base.id 
) 
select * 
from tree 
order by ordered 
; 
+0

Это не работает в моей примерной таблице Можете ли вы написать запрос, который дает результат, указанный выше, как ожидаемый результат? Спасибо – kheya

+0

Я имею в виду, что CTE сначала дает мне все родительские строки. Тогда все дети. Не первый родитель, затем его дети, а затем второй родитель и его дети и т. Д. – kheya

+0

Я точно ищу результат, используемый для отображения этого сообщения и его комментариев. Родительский комментарий, а затем его ответы (дети), затем еще один комментарий и его ответы. Ответы - это дети с родительским комментарием. – kheya

Смежные вопросы