3

これは、私の問題を説明するために作成したテーブル スキーマのバージョンです。

QuoteID、詳細、DateCreated、ModelQuoteID

ここで、QuoteID は主キーで、ModelQuoteID はこのテーブルに戻る null 許容の外部キーであり、別の見積もりからモデル化された見積もりを表します (その後、詳細列などが変更された可能性があります)。

DateCreated の降順で並べ替えられた見積もりの​​リストを返す必要があります。モデル化された見積もりは例外で、親の見積もりの​​下に配置され、他の兄弟の見積もり内で日付の降順で並べられます (見積もりは 1 レベルの深さでのみモデル化できます)。

たとえば、これらの 4 つの引用行があるとします。

1, 'Fix the roof', '01/01/2012', null
2, 'Clean the drains', '02/02/2012', null
3, 'Fix the roof and door', '03/03/2012', 1
4, 'Fix the roof, door and window', '04/04/2012', 1
5, 'Mow the lawn', '05/05/2012', null

次に、次の順序で結果を取得する必要があります。

5 - Mow the lawn
2 - Clean the drains
1 - Fix the roof
4 - -> Fix the roof, door and window
3 - -> Fix the roof and door

詳細のキーワードなどの検索基準も渡します。検索用語が含まれていなくても、親の引用には含まれているモデル化された引用を返します。モデル化されたものの結合で結合された元の引用符を取得するために、共通のテーブル式を使用してその部分が機能しています。

それはうまく機能しますが、現在、モデル化された引用符をコードで正しい順序に再配置する必要があります。私の次のステップは SQL でページングを実装することであり、その時点で行が適切にグループ化されていない場合、現在のページに子が存在せず、コードで並べ替えを行うことができないため、これは理想的ではありません。一般的に言えば、それらはいずれにしても自然にグループ化されますが、常にではありません。1 か月前の見積もりの​​モデル見積もりを今日作成することもできます。

私はこれにかなりの時間を費やしましたが、SQLの達人は助けてくれますか? とても有難い。

編集:これは、私の不自然な例に合うように私のSQLの不自然なバージョンです:-)

;with originals as (
select
    q.*
from
    Quote q
where
    Details like @details
)
select
    *
from
(
select
    o.*
from
    originals o

union

select
    q2.*
from
    Quote q2
join
    originals o on q2.ModelQuoteID = o.QuoteID
)
as combined

order by
    combined.CreatedDate desc
4

1 に答える 1

4

オリンピックを見ると、投稿をざっと見ただけで、各レベル(ルートと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

ルートノードが昇順で並べ替えられ、内部ノードが降順で並べ替えられていることがわかります。

于 2012-08-08T04:58:50.987 に答える