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