2016-08-16 15 views
0

例では20個の注文を返す必要がありますが、クエリで正しくページを設定する方法はわかりません。TransactSQL共用体ANDページング

次のクエリは、最初の20件だけでなく、20行(注文、注文ライン、補足)を返します。

SELECT * 
FROM 
(
     SELECT * 
     FROM (SELECT * 
      FROM [WS].[viewOrderDetail] AS [Extent1] 
      WHERE [Extent1].CustomerID IN (2,7,8,9)   
     ) AS [Project1]) AS [Cmd] 
LEFT JOIN [WS].[viewOrders] AS [orders] ON ([orders].Id = [cmd].OrderId) 
LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] ON ([OrderLines].OrderId= [Cmd].[OrderId]) 
LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp] ON (Supp.OrderLineId = OrderLines.Id) 
WHERE cmd.OrderId LIKE '%11301%' 

union all 

SELECT * 
FROM 
(
     SELECT * 
     FROM (SELECT * 
      FROM [WS].[viewOrderDetail] AS [Extent1] 
      WHERE [Extent1].CustomerID IN (2,7,8,9)   
     ) AS [Project1]) AS [Cmd] 
LEFT JOIN [WS].[viewOrders] AS [orders] ON ([orders].Id = [cmd].OrderId) 
LEFT JOIN [WS].[viewOrderLines] AS [OrderLines] ON ([OrderLines].OrderId= [Cmd].[OrderId]) 
LEFT JOIN [WS].[viewOrderLineSupplements] AS [Supp] ON (Supp.OrderLineId = OrderLines.Id) 
WHERE OrderLines.Id LIKE '%11301%' 
ORDER BY [Cmd].Id ASC OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY 

実際の結果: Actual result

が生じるはずである: Should result

あなたは私が適切にページ付けができる方法の任意のアイデアを持っていますか?

+1

ここで解決策を試してください:http://stackoverflow.com/questions/109232/what-is-the-best-way-to-paginate-results-in-sql-server –

+1

公正であるために、この問題はあなたがしたいことにきれいに分割します。あなたが最初にしたいですか?それぞれの詳細が含まれた20件の注文のセット。したがって、{A} = 20 {Orders}と{B} = N {Ordesimples}の2組のクエリを記述します。 Bが1つ以上の行を持つことができる場合は、結合の共通部分を使用して、それらの20の順序ですべてのデータを返します。そうでない場合は、適切なサブクエリを使用して結果を制限できます。いずれにしても、この問題は単純なものでなければなりません。 〜私の2セント –

+0

@clifton_hまあ、私は4つのテーブルを持っています:OrderDetails、Orders、OrderLines、Supplements:注文は複数の注文詳細を持つことができますが、注文線は1つの注文のみを持つことができます(注文ラインは複数のサプリメントを持つことができます)。 私はそれをより読みやすくするためにクエリを更新しました –

答えて

2

私はここにあなたのクエリ全体を再現しようとはしませんが、一つの選択肢は、注文日によって昇順を注文、あなたが持っているものを副問合せと最初の20行を選択するには、次のようになります。

SELECT t.* 
FROM 
(
    /* your UNION query here */ 
) t 
ORDER BY t.InputDate OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY 

修正最初に最初の20件の注文を日付順に取得し、結果の表を結合して対応する注文明細とサプリメントを取り込むことになります。

+0

ページング中にすべての注文ラインやサプリメントを返さないので、クエリをサブシーケンシングすることはできません –

+0

これはなぜそうなるのでしょうか。これを説明できますか? –

+0

私は20オーダーだけを返しますが、すべてのオーダーラインと補足は –

関連する問題