SQLSERVER、ORACLEで分割SELECT

SQLお役立ちメモ。

例えば500万レコードくらいあるテーブルから全件SELECTしてDataTableとかに突っ込むと、端末によりますが大体メモリ足りなくなります。500万件一括取得時の並び順はそのままに、レコードだけ10万件ずつ取り出したい。データコンバートツールとか作ってるとありがちな要求。MySQLであればLIMIT句の後にORDER BYが処理されるので簡単です。

SQLSERVERORACLEで同じようなことをしようと組んだのがこれ。

 

SQLSERVER

SELECT *

FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY [並び順] ) as RN, A.* FROM [テーブル名] as A) [テーブル名]

WHERE RN BETWEEN 1 AND 100000

 

ORACLE

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だと大丈夫。プラットフォーム系の動作不良は直接的な修正は難しいし、クライアントへの説明も大変。下調べ&予備知識って大事ね。

おわり。