2016-04-28 10 views
0

を反復処理:今を選択し、私は、クエリ持っサブセット最初

select USERNAME, BIRTHDATE, USERID, LASTONLINE, LOCATIONNAME (etc) 
from [User] 
where AccountDisabled <> 1 (and a whole bunch of other criteria) 
order by LastOnline desc offset 
@skip rows fetch next 40 rows only 

を、私は、この検索で​​優先順位を取る[ユーザー] .UserIdsのリストを与えてきた - 私たちはこれらを反復処理したいです[User]は最初に検索条件に一致するユーザーを除外し、一致する全体の[User]テーブルから次の40を返します。

どのようにパフォーマンスを優先事項として考慮してこれを行うことができますか?

答えて

2

最も簡単な解決策は、おそらくUNION ALLです:

select USERNAME, BIRTHDATE, USERID, LASTONLINE, LOCATIONNAME (etc) 
from [User] 
where AccountDisabled <> 1 (and a whole bunch of other criteria) 
AND USERID IN (list of userids) 

UNION ALL 

select * from 
(

    select USERNAME, BIRTHDATE, USERID, LASTONLINE, LOCATIONNAME (etc) 
    from [User] 
    where AccountDisabled <> 1 (and a whole bunch of other criteria) 
    AND USERID NOT IN (list of userids) 
    order by LastOnline desc offset 
    @skip rows fetch next 40 rows only 
) as dt 

それとも、このようないくつかのROW_NUMBERロジック適用されます。

select * 
from 
(
    select USERNAME, BIRTHDATE, USERID, LASTONLINE, LOCATIONNAME (etc), 
     CASE WHEN USERID IN (list of userids) THEN 0 ELSE 1 END AS grp 
     ROW_NUMBER() 
     OVER (PARTITION BY CASE WHEN USERID IN (list of userids) THEN 0 ELSE 1 END 
       ORDER BY LastOnline desc) AS rn 
    from [User] 
    where AccountDisabled <> 1 (and a whole bunch of other criteria) 
) as dt 
where grp = 0 
    or rn BETWEEN @skip AND @skip + 40 
+0

を、私はこれらをプレイする必要があります。どのような考え方がパフォーマンスに最も適していますか?私はいつもそれをいつもテストすることができます。 – RobVious

+0

ありがとうございました - これは素晴らしいです。 – RobVious

+0

RowNumberフィルタのパフォーマンスは、TOPを使用して行を制限するとよく似ています。 http://dba.stackexchange.com/questions/86415/retrieving-nrows-per-group –

関連する問題