T-SQLの小技(メモ)

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でサポートされていたとは知らなかった(^^;

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: T-SQL, 技術系 パーマリンク

T-SQLの小技(メモ) への2件のフィードバック

  1. takezou のコメント:

    ちなみに、EFクエリでTakeだけだと、
    “SELECT TOP n ・・・”
    Skipだけだと、
    “・・・ORDERBY KEY_COLUMN OFFSET n ROWS”
    が生成されるようだ。

  2. takezou のコメント:

    EFクエリに.OrderByを付けない場合はログ上にはWarningが吐かれ、下記のようなSQLとなった。
    SELECT ・・・
    FROM [TABLE_NAME] AS [T]
    ORDER BY (SELECT 1)
    OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください