Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sắp xếp thứ tự các hàng mẹ theo ngày giảm dần với các hàng con được sắp xếp độc lập bên dưới mỗi hàng

Xem Thế vận hội - chỉ cần lướt qua bài đăng của bạn - có vẻ như bạn muốn kiểm soát việc sắp xếp ở mỗi cấp (gốc và một cấp trong) và đảm bảo dữ liệu được trả về với các trẻ em trực tiếp bên dưới cấp độ gốc của nó (vì vậy bạn có thể trang dữ liệu...). Chúng tôi làm thế này hoài. Bạn có thể thêm một order by cho mỗi truy vấn bên trong và tạo một sort cột. Tôi lấy ra một ví dụ hơi khác mà bạn có thể dễ dàng áp dụng vào hoàn cảnh của mình. Tôi đã sắp xếp phần gốc tăng dần và mức một giảm dần chỉ để minh họa cách bạn có thể kiểm soát từng phần.

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

Điều này tạo ra những kết quả sau:

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

Bạn có thể thấy rằng các nút gốc được sắp xếp tăng dần và các nút bên trong được sắp xếp giảm dần.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật một trường của bảng hiện có với Logic Tăng dần Tự động

  2. Sắp xếp Dấu đầu dòng trong Cơ sở dữ liệu

  3. Vòng kết nối máy chủ SQL

  4. thêm cột động với truy vấn chọn

  5. Truy vấn SQL Server:Nhanh với Literal nhưng chậm với Variable