Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Подреждане на родителските редове по низходяща дата с дъщерни редове, подредени независимо под всеки

Гледайки Олимпиадата -- току-що прегледах набързо публикацията ви -- изглежда, че искате да контролирате сортирането на всяко ниво (корен и едно ниво в) и да се уверите, че данните се връщат с дъщерните елементи директно под родителя (така че можете да страницата на данни...). Ние правим това през цялото време. Можете да добавите order by към всяка вътрешна заявка и създайте sort колона. Измислих малко по-различен пример, който би трябвало лесно да приложите към вашите обстоятелства. Сортирах корена възходящо и ниво едно низходящо само за да илюстрирам как можете да контролирате всяка част.

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

Това води до следните резултати:

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

Можете да видите, че основните възли са сортирани възходящо, а вътрешните възли са сортирани низходящо.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSIS - Преобразуване на множество стойности на колони в нула

  2. Идентификаторът от няколко части не можа да бъде обвързан

  3. Ефикасен начин за получаване на @@rowcount от заявка с помощта на row_number

  4. Може ли UNION ALL да бъде по-бърз от JOIN или моите JOIN просто са гадни?

  5. Възможно ли е да получите mac адреса с помощта на съхранена процедура?