2015-11-30 2 views
1

любая идея о заказе этих плоских данных в соответствии с заказом?данные плоские данные Иерархический заказ

этот простой запрос не работает

select QuestionID , QuestionText , ReferenceID , ParentQuestionID from Question 
where ReferenceID = 10208 
order by ParentQuestionID,QuestionID 

плоские данные

enter image description here

это должно быть для того, как этот

enter image description here

ответ

1

Вы можете построить иерархию строки, то сортировать его. Для хранения можно использовать hierarchyid

WITH Question AS 
(
    SELECT * FROM (VALUES 
     (10208, -1), 
     (10209, 10208), 
     (10211, 10208), 
     (10214, 10208), 
     (10212, 10209), 
     (10213, 10209), 
     (10215, 10212) 
    ) Question(QuestionID, ParentQuestionID) 
), cte AS 
(
    -- Anchor 
    SELECT *, 0 AS Level, CAST('/' + CAST(QuestionID AS varchar) + '/' AS varchar(100)) AS Hierarchy 
    FROM Question WHERE ParentQuestionID = -1 
    UNION ALL 
    -- Recursive part 
    SELECT q.*, Level + 1, CAST(Hierarchy + CAST(q.QuestionID AS varchar) + '/' AS varchar(100)) 
    FROM Question q INNER JOIN cte ON q.ParentQuestionID = cte.QuestionID 
) 
SELECT * FROM cte ORDER BY Hierarchy 

SQL Fiddle

EDIT

Чтобы упорядочить по убыванию

WITH Question AS 
(
    SELECT * FROM (VALUES 
     (10208, -1), 
     (10209, 10208), 
     (10211, 10208), 
     (10214, 10208), 
     (10212, 10209), 
     (10213, 10209), 
     (10215, 10212) 
    ) Question(QuestionID, ParentQuestionID) 
), cte AS 
(
    -- Anchor 
    SELECT *, 0 AS Level, CAST('/' + CAST(QuestionID AS varchar(max)) + '/' AS varchar(max)) AS Hierarchy 
    FROM Question WHERE ParentQuestionID = -1 
    UNION ALL 
    -- Recursive part 
    SELECT q.*, Level + 1, CAST(cte.Hierarchy + CAST(q.QuestionID AS varchar(max)) + '/' AS varchar(max)) 
    FROM Question q INNER JOIN cte ON q.ParentQuestionID = cte.QuestionID 
), rn AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ParentQuestionID ORDER BY Hierarchy DESC) Seq FROM cte 
) 
SELECT * FROM rn ORDER BY ParentQuestionID, Seq 
+0

как я могу заказать ребенок вопрос, как убывающий порядок? – LittleDragon

+1

@LittleDragon См. Редактирование – Eric

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