2013-03-07 3 views
2

Я пытаюсь создать настройку форума, где вы можете прокомментировать определенные сообщения и получить ответы сразу после родителя в порядке даты. Под родителем будет только один под-уровень. Вот пример набора данных:SQL Parent/Child CTE Ordering

ID.ParentID.Datestamp 
12.NULL.2013-03-01 1:00pm 
13.NULL.2013-03-01 2:00pm 
14.12.2013-03-01 2:20pm 
15.12.2013-03-01 2:30pm 
16.NULL.2013-03-01 3:30pm 

А вот то, что я хочу, чтобы в итоге:

12.NULL.2013-03-01 1:00pm 
14.12.2013-03-01 2:20pm 
15.12.2013-03-01 2:30pm 
13.NULL.2013-03-01 2:00pm 
16.NULL.2013-03-01 3:30pm 

Я знаю, что нужна какая-то КТР происходит, но это не заказывает детей под соответствующий родитель (очевидно, поскольку не существует предложения ORDER BY); Я не мог понять правильный порядок. Может ли кто-нибудь дать представление?

; WITH Messages 
AS 
(
    SELECT ID, ParentID, Datestamp 
    FROM ForumMessages 
    WHERE ParentID IS NULL 

    -- Recursive 
    UNION ALL 
    SELECT 
     t2.ID, t2.ParentID, t2.Datestamp 
    FROM 
     ForumMessages AS t2 
     JOIN Messages AS m ON t2.ParentID = m.ID 
) 

SELECT ID, ParentID, Datestamp 
FROM Messages 
+0

Ваше окончательное утверждение простой выбор из набора, сгенерированного CTE. Он не имеет предложения ORDER BY. – Tim

+0

Правда. Я попробовал кое-что, но не мог понять правильность заказа. У вас есть ответ? – Matt

+1

Кроме того, в реальном приложении, например, вы описываете (форум), вы не будете сортировать все в базе данных; скорее, вы подождете, пока пользователь не нажмет на какое-либо конкретное сообщение форума, и только тогда вы получите свои связанные субположения, которые вы могли бы отсортировать по дате времени. – Tim

ответ

3

Для глубины одного уровня, вам не нужно использовать рекурсию - попробуйте:

SELECT ID, ParentID, Datestamp 
FROM ForumMessages 
order by coalesce(ParentID,ID), Datestamp 
+0

Марк, вы ответили первым. Спасибо, что спасли меня от чрезмерной инженерии! – Matt

0

Очень легкий путь без КТР (ISNULL функция в MSSQL, но не дают RDBMS):

SELECT ID, ParentID, Datestamp 

FROM ForumMessages 

ORDER BY ISNULL(ParentID,ID), DateStamp 

Fiddle