1

我正在尝试根据Order表中OrderDate的列名firstname来提取Customer表的最后 5 行。

下面的查询显示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

TOP我使用and的逻辑有什么错误DESC吗?

4

3 回答 3

3

如果要获取table的最后5行Order,为什么要申请TOPtableCustomer呢?

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
;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 回答
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 回答