sql - SQL中的LIMIT语句有多普遍?

标签 sql database rdbms

我正在推广 Django 数据库复制应用程序,它使用以下语句:

SELECT %s FROM %s LIMIT 1

获取 1 行并使用 Python DBAPI 来描述字段,它适用于 ORACLE 和 MySQL,但是,LIMIT 语句的跨平台程度如何?

最佳答案

LIMIT 已经在各种开源数据库中变得相当流行,但不幸的是,事实是 OFFSET 分页一直是所有这些数据库中标准化程度最低的 SQL 功能, 最迟在 SQL:2008 中被标准化.

在那之前,jOOQ user manual page on the LIMIT clause显示了如何在每种 SQL 方言中形成各种等效语句:

-- 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

选择你的毒药 ;-)

关于sql - SQL中的LIMIT语句有多普遍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1528604/

相关文章:

mysql查询不返回具有最大(id)数据的特定行

php - CakePHP - 如何即时切换数据库? (CakePHP 1.1.x)

MySQL:将一个表中的列链接到另一表中同一列的两个条目

database - DBMS 和数据库服务器之间的区别

mysql - 使用嵌套查询和内连接清理 SQL 查询

mysql - 根据 desc 列值将 id 分配给不同的组

sql - Firebird - 确定从受约束或不在触发器内发生删除的方法

php - 为什么即使数据库为空,图像也会显示损坏?

database - 在数据库中表示/设计组和成员的最佳方式是什么

mysql - 当默认情况下所有内容映射到所有内容时,多对多的正确设计