2015-04-27 5 views
0

У меня есть таблицаDESC родительских строк с ASC детей строк

Date MainID ParentID SubID 
==== ====== ======== ===== 
4/03 1   NULL  1 
4/05 2   NULL  2 
4/10 3   2   2.1 
4/11 4   1   1.1 
4/12 5   2   2.2 

Я пытаюсь получить результаты по убыванию Дата для родительских узлов, но ASC Subid для детей. Например, я хотел бы

Date MainID ParentID SubID 
==== ====== ======== ===== 
4/05 2   NULL  2 
4/10 3   2   2.1 
4/12 5   2   2.2 
4/03 1   NULL  1 
4/11 4   1   1.1 

Возможно ли это с Group By или это более сложная?

+1

Является ли иерархия только двумя уровнями? Какая версия SQL Server? Почему вы выбрали эту структуру, а не список смежности или 'hierarchyid'? –

+0

Sql Server 2008 ... может быть один родитель, обозначаемый NULL ParentID, и несколько дочерних элементов, обозначаемый инкрементным SubID, который основан на ParentID ... Я выбрал это, потому что у меня есть одна таблица для работы с а также не знакомы с списками смежности/иерархии. – eych

ответ

0

есть существует несколько возможностей сделать это, вот быстрый пример:

select * 
from t 
order by 
COALESCE(ParentId, MainId) DESC, SubID ASC 

этот запрос предполагает, что новые строки будут иметь более высокие MainId, поэтому вместо сортировки по дате, вы сортировать по родительским ID в Ордах по убыванию

образца скрипка http://sqlfiddle.com/#!6/40fa7/4

+0

, который отлично поработал ... спасибо! – eych

+0

@eych - Это не сработает, если у вас более 10 детей в узле. 2.10 не будет правильно заказываться. –

0

путь, который не делает предположение о корреляции между датами и идентификаторами и не будет сортировать строки как 2.10 перед тем 2.2

SELECT c.* 
FROM Table1 c 
     LEFT JOIN Table1 p 
     ON c.SubID LIKE CAST(p.MainID AS VARCHAR(10)) + '._%' 
ORDER BY isnull(p.Date, c.Date) DESC, 
      CAST('/' + c.SubID + '/' AS HIERARCHYID) 
Смежные вопросы