sql >> Base de Datos >  >> RDS >> Sqlserver

Ordenar las filas principales por fecha de forma descendente con las filas secundarias ordenadas de forma independiente debajo de cada una

Al ver los Juegos Olímpicos, solo eché un vistazo a su publicación, parece que desea controlar la ordenación en cada nivel (raíz y un nivel adentro) y asegurarse de que los datos se devuelvan con los niños directamente debajo de su padre (para que pueda paginar el datos...). Hacemos esto todo el tiempo. Puede agregar un order by a cada consulta interna y crea un sort columna. Ideé un ejemplo ligeramente diferente que debería ser fácil de aplicar a su circunstancia. Ordené la raíz ascendente y el nivel uno descendente solo para ilustrar cómo puedes controlar cada 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

Esto produce estos resultados:

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

Puede ver que los nodos raíz están ordenados de forma ascendente y los nodos internos están ordenados de forma descendente.