【Access】開始位置を指定したデータ取得(LIMIT、OFFSETを使わない方法)

MySQLやSQLiteなど、LIMIT句、OFFSET句が使用できる環境なら「取得したデータの何番目のデータを取得する」というのは簡単に出来るが、AccessなどLIMIT句などが使えない環境で同様のことをするにはどうすればいいか?

やり方のひとつとして、以下にメモしておく。

データ

サンプルデータは以下の通り。

table01 テーブル
ID(主キー) DATA
1 ABC
2 DEF
3 GHI
4 JKL
5 MNO

クエリ(SQL文)

取得したデータのうち、3番目から2レコードだけ抽出する場合

LIMIT、OFFSET句を使った場合

SELECT * FROM table01 LIMIT 2 OFFSET 2;
結果
ID DATA
3 GHI
4 JKL

すごいシンプル、分かりやすい。

LIMIT、OFFSET句を使わない場合

で、Accessで上記をやろうとした場合のSQL文例。

SELECT TOP 2 * FROM table01
  LEFT JOIN (SELECT TOP 2 * FROM table01) AS t2
    ON table01.ID = t2.ID
 WHERE t2.ID IS NULL;
結果
table01.ID table01.DATA t2.ID t2.DATA
3 GHI NULL NULL
4 JKL NULL NULL

逆にMySQLでTOP句は使えないんだけどね。

解説

代わりに使っているのがTOP句と外部結合(LEFT JOIN 〜 ON 〜)。

TOPは、上から指定個数のデータを取得する。
LEFT JOINは、2つのテーブルを指定条件で結合する。

ステップ毎にデータの動きを見ると分かりやすい。

(SELECT TOP 2 * FROM table01) AS t2

まず、この部分。
これはtable01テーブルの上位2レコードを抽出し、t2テーブルとして定義している。

t2 テーブル
ID DATA
1 ABC
2 DEF

こんな感じ。
で、次にtable01とt2の外部結合を見てみる。
(t2テーブルの部分は省略して記載する)

table01 LEFT JOIN t2 ON table01.ID = t2.ID
結合結果
table01.ID table01.DATA t2.ID t2.DATA
1 ABC 1 ABC
2 DEF 2 DEF
3 GHI NULL NULL
4 JKL NULL NULL
5 MNO NULL NULL

LEFT JOINは、左辺のテーブルを全て列挙した上で、右辺のテーブルと結合する。
よって、結合できていない部分にはNULLが入る。

ここまで来れば、あとは単純なSELECTで任意の個数を取得するだけ。
(同様に省略形式で記載する)

SELECT TOP 2 * FROM 結合結果
 WHERE t2.ID IS NULL;

これで、下記の結果となる。

結果
table01.ID table01.DATA t2.ID t2.DATA
3 GHI NULL NULL
4 JKL NULL NULL

以上

投稿者: Output48

中学生の時に初めてHTMLに触れてからホームページ制作を独学で始める。 ベンチャー企業の営業、大手企業のSEを経て、独立。 ここ数年はWEB以外の仕事をしていたため、割と本気で勉強中。

コメントを残す

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