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

Sortering af overordnede rækker efter dato faldende med underordnede rækker ordnet uafhængigt under hver

Når du ser OL -- har lige skimmet dit indlæg -- ser det ud som om du vil kontrollere sorteringen på hvert niveau (rod og et niveau i), og sørge for at dataene returneres med børnene direkte under dets forælder (så du kan bladre data...). Det gør vi hele tiden. Du kan tilføje en order by til hver indre forespørgsel og opret en sort kolonne. Jeg udtænkte et lidt anderledes eksempel, som burde være nemt for dig at anvende på din omstændighed. Jeg sorterede roden stigende og niveau et faldende blot for at illustrere, hvordan du kan kontrollere hver del.

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

Dette giver disse resultater:

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

Du kan se, at rodknuderne er sorteret stigende, og de indre knudepunkter er sorteret faldende.




  1. Kommaseparerede værdier i MySQL IN-sætning

  2. UTL_MATCH-lignende funktion til at arbejde med CLOB

  3. Doktrine 2:Kan ikke opdatere kolonnen DateTime på SQL Server 2008apm

  4. SQL 2008 krydsdatabaseydelse på samme fysiske maskine og samme serverinstans