1

テーブルの列名Orderに基づいて、テーブルの最後の5行を取得しようとしています。OrderDatefirstnameCustomer

以下のクエリはOrder、最後の 5 行ではなく、テーブルのすべての値を表示します。

SELECT  
   A.[FirstName], B.[OrderId], B.[OrderDate], B.[TotalAmount], B.[OrderStatusId]
FROM  
   [schema].[Order] B 
OUTER APPLY
   (SELECT TOP 5  *
    FROM [schema].[Customer] A  
    WHERE B.[CustomerId] = 1 
      AND A.[CustomerId] = B.[CustomerId] 
   ORDER BY
      B.[OrderDate] DESC) A

TOPandを使用する私の論理に間違いはありDESCますか?

4

3 に答える 3

3

tableの最後の 5 行を取得したい場合Order、なぜ table に適用TOPするCustomerのですか?

SELECT TOP 5 A.[FirstName],B.[OrderId],B.[OrderDate],B.[TotalAmount],B.[OrderStatusId]
FROM  [schema].[Order] B 
LEFT JOIN [schema].[Customer] A ON A.[CustomerId]=B.[CustomerId] 
WHERE B.[CustomerId]=1 
ORDER BY  B.[OrderDate] DESC 
于 2013-08-26T12:37:06.060 に答える
1

を使用できますが、そのようなクエリについては次のようOUTER APPLYに考えています。row_number()

SELECT  A.[FirstName],B.[OrderId],B.[OrderDate],B.[TotalAmount],B.[OrderStatusId]
FROM  [schema].[Order] B join
      (select A.*, row_number() over (partition by CustomerId order by OrderDate desc) as seqnum
       from [schema].[Customer] A
       where A.[CustomerId] = 1 -- AND A.[CustomerId]=B.[CustomerId] 
      ) A
      on A.[CustomerId] = B.[CustomerId] and seqnum <= 5;
于 2013-08-26T12:36:33.557 に答える
1
;WITH MyCTE AS
(

    SELECT  A.[FirstName],
            B.[OrderId],
            B.[OrderDate],
            B.[TotalAmount],
            B.[OrderStatusId],
            ROWNUMBER() OVER (ORDER BY B.[OrderDate] DESC) AS RowNum
    FROM    [schema].[Order] B 
            OUTER APPLY
            (  
                SELECT  TOP 5  *
                FROM    [schema].[Customer] A  
                WHERE   B.[CustomerId]=1 
                        AND A.[CustomerId]=B.[CustomerId] 
                ORDER BY
                B.[OrderDate] DESC                  
            )     A
)

SELECT [FirstName],
       [OrderId],
       [OrderDate],
       [TotalAmount],
       [OrderStatusId] 
FROM   MyCTE
WHERE  RowNum <= 5
于 2013-08-26T12:35:01.963 に答える