0
Account
=======
int AccountId PK

Order
=====
int OrderId PK
int AccountId FK
DateTime Date
int Status

アカウントごとに、ステータスが1(成功)の最新の注文を知りたい。そうでない場合は、ステータスが0(失敗)の最新の注文を知りたい。日付は一意ではありません。

私はこれをこのようなビューで相関サブクエリで動作させています...

SELECT
    a.AccountId,
    (SELECT TOP 1
            o.orderId
        FROM
            tbl_order o
        WHERE
            o.Accountid = a.AccountId
            AND
            o.Status IN (0, 1)
        ORDER BY
            o.Status DESC, o.Date DESC  
        ) AS OrderId
FROM
    tbl_account a

...しかし、その遅い。

もっと良い方法はありますか?

4

2 に答える 2

3

ROW_NUMBER次の機能でCTEを使用できます。

WITH cte AS(
    SELECT  a.AccountId, o.OrderId, o.Date, o.Status
    , RN = ROW_NUMBER()OVER(Partition By a.AccountId ORDER BY o.Status DESC, o.Date DESC) 
    FROM Account a 
    LEFT OUTER JOIN [Order] o  ON a.AccountId = o.AccountId
)
SELECT AccountId, OrderId
FROM cte
WHERE RN = 1

これがフィドルです:http ://sqlfiddle.com/#!3 / 4e1e3 / 4/0

于 2012-07-12T22:06:00.583 に答える
0

これを試して:

SELECT
    a.AccountId,
        o.OrderId
FROM
    tbl_account a OUTER APPLY 
        (
            SELECT TOP 1 o.orderId
        FROM tbl_order o
       WHERE o.Accountid = a.AccountId
         AND o.Status IN (0, 1)
        ORDER BY o.Status DESC, o.Date DESC  
     ) AS o
于 2012-07-12T22:03:20.990 に答える