[ Oracle ] ROWNUM を使って LIMIT, OFFSET 句の動作を再現させる

Pocket

Oracle では、 Mysql や PostgreSQL で使用可能な LIMIT, OFFSET 句を使用して取得するレコードの範囲を指定することはできません。ここでは、Oracle の ROWNUM 擬似列を使用して、LIMIT, OFFSET 句の動作を再現させるサンプルを掲載しています。

スポンサーリンク

MySQL の LIMIT, OFFSET 句 SQL サンプル

まずは、最初の 5 レコードを除外して、6 レコード目から 10 レコードを取得する SQL のサンプルです。

// PostgreSQL と互換性のある記述方法
SELECT * FROM table1 LIMIT 10 OFFSET 5;

// mysql 独自の記述方法
SELECT * FROM table1 LIMIT 5, 10;

ROWNUM 疑似列を使用して LIMIT および OFFSET 句を再現

Mysql や PostgreSQL の LIMIT および OFFSET 句を Oracle の ROWNUM を使って再現する SQL になります。 ただし、ROWNUM カラム(サンプル内の ADD_ROWNUM)が追加されることになるので、完全に一致した結果が取得できる というわけではありませんが、問題となることも少ないのではないでしょうか。

SELECT 
    a2.*
FROM 
    (
    SELECT 
        a1.*, ROWNUM AS "ADD_ROWNUM"
    FROM 
        (
        SELECT * FROM table1
        ) a1
    ) a2
WHERE a2."ADD_ROWNUM" BETWEEN 6 AND 15

SQL Server の場合

SQL Server も LIMIT および OFFSET 句は使用できません。(未検証ですが) SELECT TOP や ROW_NUMBER() OVER 等を使用して同等の動作を再現することはできそうです。

参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *