LIMIT
मुक्त स्रोत डेटाबेस की एक किस्म के साथ काफी लोकप्रिय हो गया है, लेकिन दुर्भाग्य से, तथ्य यह है कि OFFSET
पृष्ठांकन, के रूप में देर से SQL:2008 में के रूप में मानकीकृत किया गया है उन सब से कम से कम मानकीकृत एसक्यूएल सुविधा के बारे में की गई है।
तब तक, jOOQ user manual page on the LIMIT
clause दिखाता है कि कैसे विभिन्न बराबर बयान प्रत्येक एसक्यूएल बोली में गठित किया जा सकता:
-- MySQL, H2, HSQLDB, Postgres, and SQLite
SELECT * FROM BOOK LIMIT 1 OFFSET 2
-- CUBRID supports a MySQL variant of the LIMIT .. OFFSET clause
SELECT * FROM BOOK LIMIT 2, 1
-- Derby, SQL Server 2012, Oracle 12c, SQL:2008 standard
-- Some need a mandatory ORDER BY clause prior to OFFSET
SELECT * FROM BOOK [ ORDER BY ... ] OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
-- Ingres
SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
-- Firebird
SELECT * FROM BOOK ROWS 2 TO 3
-- Sybase SQL Anywhere
SELECT TOP 1 ROWS START AT 3 * FROM BOOK
-- DB2 (without OFFSET)
SELECT * FROM BOOK FETCH FIRST 1 ROWS ONLY
-- Sybase ASE, SQL Server 2008 (without OFFSET)
SELECT TOP 1 * FROM BOOK
अब, इन सब सुंदर सीधी-सपाट, सही थे? यहाँ बुरा हिस्सा आता है, उन्हें अनुकरण करने के लिए आपके पास:
-- DB2 (with OFFSET), SQL Server 2008 (with OFFSET),
SELECT * FROM (
SELECT BOOK.*,
ROW_NUMBER() OVER (ORDER BY ID ASC) AS RN
FROM BOOK
) AS X
WHERE RN > 2
AND RN <= 3
-- DB2 (with OFFSET), SQL Server 2008 (with OFFSET)
-- When the original query uses DISTINCT!
SELECT * FROM (
SELECT DISTINCT BOOK.ID, BOOK.TITLE
DENSE_RANK() OVER (ORDER BY ID ASC, TITLE ASC) AS RN
FROM BOOK
) AS X
WHERE RN > 2
AND RN <= 3
-- Oracle 11g and less
SELECT *
FROM (
SELECT b.*, ROWNUM RN
FROM (
SELECT *
FROM BOOK
ORDER BY ID ASC
) b
WHERE ROWNUM <= 3
)
WHERE RN > 2
Read about the ROW_NUMBER()
vs. DENSE_RANK()
rationale here
अपने जहर ;-)
स्रोत
2014-06-04 20:09:37
ओरेकल के किन संस्करणों में है कि काम करता है चुनें? –
ओरेकल 9आई @ अल्फासेवर, मेरी गलती, बस कोशिश की, काम नहीं करता है :( –