最も簡単な解決策は、おそらく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
を、私はこれらをプレイする必要があります。どのような考え方がパフォーマンスに最も適していますか?私はいつもそれをいつもテストすることができます。 – RobVious
ありがとうございました - これは素晴らしいです。 – RobVious
RowNumberフィルタのパフォーマンスは、TOPを使用して行を制限するとよく似ています。 http://dba.stackexchange.com/questions/86415/retrieving-nrows-per-group –