1

私はこのような状況にあります。Ordersに関連するテーブルがありますOrderStatus

OrderStatus

id | orderId | created

最後のステータスOrdersでを取得する必要があります。私はこのクエリを試しましたが、パフォーマンスが高いかどうかはわかりません。より良い解決策があるかどうかを知る必要があります。

select Orders.id, OrderStatus.status from Orders
inner join OrderStatus on OrderStatus.id = 
    (select top 1 id from OrderStatus where orderId = Order.id order by created desc)
4

2 に答える 2

2

Row_Number次の関数を使用できます。

WITH CTE AS
(
   SELECT Orders.id, OrderStatus.status,
      RN = ROW_NUMBER() OVER (
                        PARTITION BY OrderStatus.OrderId 
                        ORDER BY created DESC) 
   FROM Orders
   INNER JOIN OrderStatus ON  OrderStatus.OrderId = Orders.id
)
SELECT id, status
FROM CTE WHERE RN = 1

直接フィルタリングが可能で、非常に読みやすいので、common-table-expressionを使用しました。

于 2013-02-19T16:05:32.083 に答える
2

通常、相関サブクエリは悪いニュースです (SQL Server が最適化して除去できる場合もあれば、非常に遅いループのように動作する場合もあります)。DISTINCTまた、主キーがない場合を除き、最新のステータスのみを取得しているときに必要だと思う理由もわかりません...

;WITH x AS 
(
  SELECT o.id, os.status, 
    rn = ROW_NUMBER() OVER (PARTITION BY os.orderId ORDER BY created DESC)
    FROM dbo.Orders AS o
    INNER JOIN dbo.OrderStatus AS os
    ON o.id = os.orderId
)
SELECT id, status
  FROM x
  WHERE rn = 1;
于 2013-02-19T16:05:37.367 に答える