2013-11-23 2 views
1

Мне нужно создать запрос, который возвращает набор записей родительских заметок, а их дочерние заметки, перечисленные ниже каждого родителя, упорядоченные родительским (корневым) идентификатором заметки.Проблема с заказом SQL Server родительского/дочернего CTE

Например, вот вывод я хотел бы видеть:

enter image description here

Я использовал принятое решение от this page, которое было так:

SELECT ID, ParentID, Datestamp 
FROM ForumMessages 
ORDER BY coalesce(ParentID, ID), Datestamp 

Мой полученный запрос был:

SELECT NoteID, ParentNoteID, NoteText 
FROM dms_Notes 
WHERE DocketID = 43477 -- this filter is just to make the resultset smaller 
ORDER BY Coalesce(NoteID, ParentNoteID), NoteText 

В результате этого e ниже. Как вы можете видеть, последняя запись с идентификатором 23478 нет в списке ниже родительского 23471

enter image description here

Я также попытался переключения ORDER BY вокруг ParentNoteID, NoteID, но результат был еще дальше от:

enter image description here

Что не так и почему это не работает? Я попытался обосновать его на принятом решении, но он просто не работает должным образом? Благодарю.

ответ

2

Не могли бы вы попробовать:

SELECT NoteID, ParentNoteID, NoteText 
FROM dms_Notes 
WHERE DocketID = 43477 -- this filter is just to make the resultset smaller 
ORDER BY IIF(ParentNoteID <> 0, ParentNoteID, NoteID), NoteText 

В COALESCE функция возвращает первый элемент, который IS NOT NULL, но вы используете 0 вместо NULL, чтобы проверить, если элемент является родителем.

В предоставляющей ссылке StackOverflow пользователь использует NULL' to do this. Because of this you have to change the condition logic user in the ORDER BY` clause.

EDIT:

Как marc_S точка в комментарии, если вы не используете SQL Server 2012, вы можете заменить заявление IIF с CASE WHEN блоком.

+0

'IIF' это ** новая функция ** в SQL Server ** 2012 ** - это не доступны в более ранних версиях –

+0

@gotqn я видел это. Хорошо заметили и спасибо за помощь. – Cheeky

2

У вас нет той же настройки, что и ссылочный пост. В частности, у вас есть 0 для родительского элемента, когда у него нет родителя вместо NULL. Таким образом, COALESCE никогда ничего не сделает. Итак, вам нужно что-то вроде:

Order by case when parentid = 0 then noteid else parentid end 
Смежные вопросы