sql >> データベース >  >> RDS >> Sqlserver

親行を日付の降順で並べ替え、子行をそれぞれの下に個別に並べる

    オリンピックを見て - あなたの投稿をざっと読んだだけです - 各レベル (ルートと 1 レベル) で並べ替えを制御し、親のすぐ下にある子でデータが返されるようにします (したがって、データ...)。私たちはこれを常に行っています。 order by を追加できます 各内部クエリに sort を作成します 桁。あなたの状況に簡単に適用できるように、少し異なる例を考案しました。各部分をどのように制御できるかを説明するために、ルートを昇順に並べ替え、レベル 1 を降順に並べました。

    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. MySQLの別のテーブルに存在しない行を表示する方法

    2. HibernateIDインクリメントオラクル

    3. 配列mysqlのように列名のみを取得

    4. 1で始まるように、1次元配列の配列添え字を正規化します。