Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Classement des lignes parentes par date décroissante avec des lignes enfants classées indépendamment sous chacune

Regarder les Jeux olympiques -- je viens de survoler votre message -- semble vouloir contrôler le tri à chaque niveau (racine et un niveau), et vous assurer que les données sont renvoyées avec les enfants directement sous son parent (afin que vous puissiez paginer le Les données...). Nous faisons cela tout le temps. Vous pouvez ajouter un order by à chaque requête interne et créez un sort colonne. J'ai inventé un exemple légèrement différent qui devrait être facile à appliquer à votre situation. J'ai trié la racine ascendante et le niveau un descendant juste pour illustrer comment vous pouvez contrôler chaque partie.

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

Cela produit ces résultats :

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

Vous pouvez voir que les nœuds racines sont triés par ordre croissant et que les nœuds internes sont triés par ordre décroissant.