Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ordinamento delle righe principali per data decrescente con le righe secondarie ordinate indipendentemente sotto ciascuna

Guardando le Olimpiadi - appena sfogliato il tuo post - sembra che tu voglia controllare l'ordinamento a ogni livello (root e un livello in) e assicurarti che i dati vengano restituiti con i bambini direttamente sotto il suo genitore (in modo da poter paginare il dati...). Lo facciamo sempre. Puoi aggiungere un order by a ciascuna query interna e creare un sort colonna. Ho inventato un esempio leggermente diverso che dovrebbe essere facile da applicare alla tua circostanza. Ho ordinato la radice ascendente e il livello uno discendente solo per illustrare come puoi controllare ogni parte.

declare @tbl table (id int, parent int, name varchar(10))

insert into @tbl (id, parent, name)
values (1, null, 'def'), (2, 1, 'this'), (3, 1, 'is'), (4, 1, 'a'), (5, 1, 'test'),
       (6, null, 'abc'), (7, 6, 'this'), (8, 6, 'is'), (9, 6, 'another'), (10, 6, 'test')

;with cte (id, parent, name, sort) as (
  select id, parent, name, cast(right('0000' + cast(row_number() over (order by name) as varchar(4)), 4) as varchar(1024))
  from   @tbl
  where  parent is null

  union all

  select t.id, t.parent, t.name, cast(cte.sort + right('0000' + cast(row_number() over (order by t.name desc) as varchar(4)), 4) as varchar(1024))
  from   @tbl t inner join cte on t.parent = cte.id
)
select * from cte
order by sort

Questo produce questi risultati:

id    parent    name     sort
----  --------  -------  ----------
6     NULL      abc      0001
7     6         this     00010001
10    6         test     00010002
8     6         is       00010003
9     6         another  00010004
1     NULL      def      0002
2     1         this     00020001
5     1         test     00020002
3     1         is       00020003
4     1         a        00020004

Puoi vedere che i nodi radice sono ordinati in ordine crescente e i nodi interni sono ordinati in ordine decrescente.