web-dev-qa-db-ja.com

MYSQLLIMITキーワードに代わるANSISQLはありますか?

MYSQLLIMITキーワードに代わるANSISQLはありますか?

LIMITキーワードは、SELECTによって返される行数を制限します。例:

SELECT * FROM People WHERE Age > 18 LIMIT 2;

2行を返します。

SELECT * FROM People WHERE Age > 18 LIMIT 10, 2;

最初の10の後に2行を返します。

30
Gary Willoughby

これはさまざまな方法を示しています:

-- DB2
select * from table fetch first 10 rows only 
-- Informix 
select first 10 * from table 
-- Microsoft SQL Server and Access 
select top 10 * from table 
-- MySQL and PostgreSQL 
select * from table limit 10 
-- Oracle 
select * from (select * from table) where rownum <= 10
36
jle

SQL:1999にはありません。

後の標準で使用できるアプローチは2つあり、今日のDBMSでは一般的にサポートレベルが低くなっています。

SQL:2008では、DB/2構文を使用できます。

SELECT * FROM things
ORDER BY smell
FETCH FIRST n ROWS ONLY

これは「LIMITn」でのみ機能し、拡張された「LIMIT m、n」オフセット構文では機能しません。 SQL:2003では、ウィンドウ関数を使用できます。これは、拡張構文をサポートできますが、スーパーPITAです。

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY smell) AS rn,
    FROM things
)
WHERE rn<=n -- or rn BETWEEN m+1 AND m+n

今日は、通常、DBMS固有のメソッドを使用します。

22
bobince

参照 http://en.wikipedia.org/wiki/Select_(SQL)#FETCH_FIRST_clause

SELECT * FROM T LIMIT 10 OFFSET 20 -- Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2

SELECT * from T WHERE ROWNUM <= 10 -- Oracle (also supports the standard, since Oracle8i)

SELECT FIRST 10 * from T -- Ingres

SELECT FIRST 10 * FROM T order by a -- Informix

SELECT SKIP 20 FIRST 10 * FROM T order by c, d -- Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack)

SELECT TOP 10 * FROM T -- MS SQL Server, Sybase ASE, MS Access

SELECT TOP 10 START AT 20 * FROM T -- Sybase SQL Anywhere (also supports the standard, since version 9.0.1)

SELECT FIRST 10 SKIP 20 * FROM T -- Interbase, Firebird

SELECT * FROM T ROWS 20 TO 30 -- Firebird (since version 2.1)

SELECT * FROM T
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY -- DB2

SELECT * FROM T
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY -- DB2 (new rows are filtered after comparing with key column of table T)
12
groovehunter

私はそうは思わない。私が知っているすべてのデータベースは、その機能にベンダー固有のキーワードを使用しています。

3
Jeremy DeGroot

HSQL/H2はMySQLのようにLIMITを使用します

1
Manik Surtani

@jleに追加 answer

  • SQLiteはLIMIT(MySQL/PostgreSQL)をサポートしています
  • InterBase/FirebirdのサポートSELECT FIRSTおよびSKIP(Informixなど)

Microsoft SQL Server2000でMySQLLIMIT句をエミュレートする も参照してください。

1
Bill Karwin
0
ジョージ