sql >> Databáze >  >> RDS >> Sqlserver

Seřazení nadřazených řádků podle data sestupně s podřízenými řádky seřazenými nezávisle pod každým

Sledování olympijských her – jen prolétl váš příspěvek – vypadá, že chcete ovládat řazení na každé úrovni (kořen a jedna úroveň) a zajistit, aby se data vracela s dětmi přímo pod jejich nadřazeným prvkem (takže můžete stránku data...). Děláme to pořád. Můžete přidat order by na každý vnitřní dotaz a vytvořte sort sloupec. Vymyslel jsem trochu jiný příklad, který by pro vás mělo být snadné aplikovat na vaši situaci. Seřadil jsem kořen vzestupně a první úroveň sestupně, jen abych ilustroval, jak můžete ovládat jednotlivé části.

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

Výsledkem jsou tyto výsledky:

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

Můžete vidět, že kořenové uzly jsou seřazeny vzestupně a vnitřní uzly jsou seřazeny sestupně.




  1. Android JDBC nefunguje:ClassNotFoundException v ovladači

  2. Jaký je maximální rozsah varchar v MySQL?

  3. SQL Server SELECT do existující tabulky

  4. mysql LOAD DATA INFILE s automatickým zvýšením primárního klíče