SQLSERVER、ORACLEで分割SELECT
SQLお役立ちメモ。
例えば500万レコードくらいあるテーブルから全件SELECTしてDataTableとかに突っ込むと、端末によりますが大体メモリ足りなくなります。500万件一括取得時の並び順はそのままに、レコードだけ10万件ずつ取り出したい。データコンバートツールとか作ってるとありがちな要求。MySQLであればLIMIT句の後にORDER BYが処理されるので簡単です。
SQLSERVER、ORACLEで同じようなことをしようと組んだのがこれ。
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY [並び順] ) as RN, A.* FROM [テーブル名] as A) [テーブル名]
WHERE RN BETWEEN 1 AND 100000
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY [並び順] ) as RN, A.* FROM [テーブル名] as A ORDER BY [並び順])
WHERE RN BETWEEN 1 AND 100000
ちなみにVBやVCでORACLEを扱うとき、OracleCommandクラスはダメ。公開されていない機能が多々あるっぽく、ちょっと凝ったクエリを組むとすぐ訳の分からないエラーメッセージを出してきます。このクエリも動かない。OleDbCommandだと大丈夫。プラットフォーム系の動作不良は直接的な修正は難しいし、クライアントへの説明も大変。下調べ&予備知識って大事ね。
おわり。