Rob*_*rio 17 sql database rdbms
我正在推广Django数据库复制应用程序,它使用以下语句:
SELECT %s FROM %s LIMIT 1
Run Code Online (Sandbox Code Playgroud)
要获取1行并使用Python DBAPI来描述字段,它可以与ORACLE和MySQL一起使用,但是,跨平台是如何使用LIMIT语句的?
Luk*_*der 24
LIMIT
已经变得非常受各种开源数据库的欢迎,但不幸的是,事实是OFFSET
分页一直是关于它们的最不标准化的SQL特性,已经在SQL:2008中被标准化.
在此之前,该子句上LIMIT
的jOOQ用户手册页显示了如何在每个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
Run Code Online (Sandbox Code Playgroud)
现在,这些都很直接,对吧?当你必须模仿它们时,这是令人讨厌的部分:
-- 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
Run Code Online (Sandbox Code Playgroud)
在这里阅读ROW_NUMBER()
与DENSE_RANK()
理由相关的内容
选择你的毒药;-)
Bol*_*ait 10
http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows列出了select命令的所有主要变体.
我相信最好的方法是在SELECT语句之前使用SET ROWCOUNT命令.
所以,对你来说:
SET ROWCOUNT 1
SELECT %s FROM %s
Run Code Online (Sandbox Code Playgroud)
它根本不普遍.实际上我很惊讶它在Oracle中为你工作; 它曾经不存在.通常Oracle用户会选择ROWNUM
.
每个数据库都有自己的语法,用于按行号限制结果.还有两种方法是ANSI标准SQL:
FETCH FIRST
.源自DB/2并且仅在SQL:2008中成为标准,因此对DBMS的支持非常少.不能使用偏移量.
窗口函数SELECT ..., ROW_NUMBER() OVER (ORDER BY some_ordering) AS rn WHERE rn BETWEEN n AND m ... ORDER BY some_ordering
.这是来自SQL:2003并且在较新的DBMS中具有一些(补丁,有时慢)支持.它可以在行号上使用偏移量或任何其他比较函数,但具有令人难以置信的难看的缺点.
如果您想要跨DBMS分页支持,这里可以很好地概述您将要处理的乏味.
归档时间: |
|
查看次数: |
13373 次 |
最近记录: |