T-SQLの小技?を一つ。
MySQLでは、以下のようにSELECT文にLIMIT句を指定して、クエリ結果から指定オフセットから指定件数分取得することが可能。
SELECT ・・・ FROM TABLE_NAME ・・・ LIMIT 10,5 -- クエリ結果の5行目から10行分
-- または
SELECT ・・・ FROM TABLE_NAME ・・・ LIMIT 10 OFFSET 5 -- クエリ結果の5行目から10行分
ではT-SQLで同じ事を行なう場合はどうすれば良いのか?
昔はスマートなやり方はなかったが、SQL Server 2012からは以下の構文で取得が可能となったようだ。(但し、ORDER BY句の一部だが・・・)
-- クエリ結果の@START_OFFSET行目から@FETCH_NUMBER行分取得
SELECT COLUMN_1[,COLUMN_2[,...]] FROM TABLE_NAME
・・・
ORDER BY KEY_COLUMN
OFFSET @START_OFFSET ROWS
FETCH NEXT @FETCH_NUMBER ROWS ONLY
※↓EFでSQL Serverに対して.Skipや.Takeを使用すると、上記と同様なSQLが作成された。
var q = ctx.TABLE_NAME.OrderBy(v=>v.KEY_COLUMN).Skip(n).Take(m);
SELECT ・・・
FROM TABLE_NAME AS [T]
ORDER BY [T].[KEY_COLUMN]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY
これって結構使う機能だと思うのだけど、T-SQLでサポートされていたとは知らなかった(^^;
ちなみに、EFクエリでTakeだけだと、
“SELECT TOP n ・・・”
Skipだけだと、
“・・・ORDERBY KEY_COLUMN OFFSET n ROWS”
が生成されるようだ。
EFクエリに.OrderByを付けない場合はログ上にはWarningが吐かれ、下記のようなSQLとなった。
SELECT ・・・
FROM [TABLE_NAME] AS [T]
ORDER BY (SELECT 1)
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY