2016-08-16 4 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} 인 두 세트의 쿼리를 설명합니다. B가 하나 이상의 행을 가질 수있는 경우 조인의 교차를 사용하여 20 개의 주.에있는 모든 데이터를 리턴하십시오. 그렇지 않은 경우 적절한 하위 쿼리를 사용하여 결과를 제한 할 수 있습니다. 어느 쪽이든,이 문제는 간단해야합니다. ~ 내 2 센트 –

+0

@clifton_h 글쎄, 나는 4 개의 테이블을 가지고있다 : OrderDetails, Orders, OrderLines, Supplements : 주문은 여러 개의 주문 상세 정보를 가질 수 있지만 주문 라인은 하나의 주문 만 가질 수있다 (주문 라인에는 여러 개의 보충 물을 가질 수있다). 더 읽기 쉽게 쿼리를 업데이트했습니다. –

답변

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 개 주문 만 반환하고 모든 주문 라인과 보충 물을 반환하고 싶습니다. –