[SQL] SQL의 LIMIT 문은 얼마나 보편적인가?
SQLSQL의 LIMIT 문은 얼마나 보편적인가?
나는 장고 DB 복제 응용 프로그램을 일반화하는 과정에있어 그리고 그것은 문을 사용하여
SELECT %s FROM %s LIMIT 1
이 오라클과 MySQL과 벌금을 작동하지만, 한계 문이 방법 크로스 플랫폼, 1 개 행을 가져오고 필드를 설명하기 위해 파이썬 DBAPI를 사용 하는가?
해결법
-
==============================
1.http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows 모든 선택 명령의 주요 변종의 목록입니다.
http://en.wikipedia.org/wiki/Select_(SQL)#Limiting_result_rows 모든 선택 명령의 주요 변종의 목록입니다.
나는이 작업을 수행하는 가장 좋은 방법은 당신의 SELECT 문 앞에 SET의 ROWCOUNT 명령을 사용하는 것입니다 생각합니다.
그래서, 당신을 위해 :
SET ROWCOUNT 1 SELECT %s FROM %s
-
==============================
2.LIMIT는 오픈 소스 데이터베이스의 다양한 매우 인기를 끌고있다,하지만 불행히도, 사실은 OFFSET 매김이, 그들 모두의 가장 표준화 된 SQL 기능에 대한되었습니다 SQL과 후반으로 표준화 된 것입니다 : 2008.
LIMIT는 오픈 소스 데이터베이스의 다양한 매우 인기를 끌고있다,하지만 불행히도, 사실은 OFFSET 매김이, 그들 모두의 가장 표준화 된 SQL 기능에 대한되었습니다 SQL과 후반으로 표준화 된 것입니다 : 2008.
그때까지, 다양한 동등한 문이 각 SQL 언어에 형성 될 수있다 방법 LIMIT 절 쇼에 jOOQ 사용 설명서 페이지 :
-- 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
근거 여기) 대 DENSE_RANK ()합니다 (ROW_NUMBER에 대해 읽어보기
당신의 독을 선택 ;-)
-
==============================
3.LIMIT는 아주 멀리 우주에서입니다 - 밖으로 주요 RDBMS의, 그것은 꽤 많은 MySQL과 PostgreSQL을 제한합니다. 다음은이가 MSSQL, Oracle 및 DB2를 포함하여 다른 많은 구현에서 수행뿐만 아니라 ANSI SQL의 방법에 대한 자세한 분석이다.
LIMIT는 아주 멀리 우주에서입니다 - 밖으로 주요 RDBMS의, 그것은 꽤 많은 MySQL과 PostgreSQL을 제한합니다. 다음은이가 MSSQL, Oracle 및 DB2를 포함하여 다른 많은 구현에서 수행뿐만 아니라 ANSI SQL의 방법에 대한 자세한 분석이다.
-
==============================
4.그것은 모든 보편적에서이 아니다. 사실은 내가 오전는 오라클에서 당신을 위해 노력하고 있습니다 놀라게; 그것은 존재하는 데 사용되지 않았다. 일반적으로 오라클 사용자는 ROWNUM에 대한 이동합니다.
그것은 모든 보편적에서이 아니다. 사실은 내가 오전는 오라클에서 당신을 위해 노력하고 있습니다 놀라게; 그것은 존재하는 데 사용되지 않았다. 일반적으로 오라클 사용자는 ROWNUM에 대한 이동합니다.
모든 데이터베이스는 행 번호로 결과를 제한하는 고유 한 구문이 있습니다. ANSI 표준 SQL있는 방법은 두 가지가 있습니다
여기에 당신이 크로스 DBMS의 페이지 매김 지원을 원하는 경우 처리해야합니다 지루함의 좋은 개요입니다.
-
==============================
5.그것은 (대신 ㅋ로부터 SELECT TOP 10 *를 사용하는) MSSQL에서 작동하지 않습니다. DB를 시장의 상당 부분 밖으로 그 잘라냅니다. 나는 다른 사람에 대해 확실하지 않다.
그것은 (대신 ㅋ로부터 SELECT TOP 10 *를 사용하는) MSSQL에서 작동하지 않습니다. DB를 시장의 상당 부분 밖으로 그 잘라냅니다. 나는 다른 사람에 대해 확실하지 않다.
또한, 귀하의 DB API는 당신을 위해 그것을 번역하는 것, 매우 가능성이 있지만, 가능합니다.
-
==============================
6.LIMIT는 1992 년 표준과 ANSI SQL 표준의 일부가 아닙니다; 나는 손에 이후 표준의 사본이 없습니다. 표준과 납품업자의 준수는 시대의 최고의 꽤 모호합니다. 그것의 가치, "LIMIT는"예약 된 단어로 나열 무엇을 위해 (이 구현에 키워드 아니라 어디 법적으로도 경우에 식별자로 사용할 수 없습니다 의미).
LIMIT는 1992 년 표준과 ANSI SQL 표준의 일부가 아닙니다; 나는 손에 이후 표준의 사본이 없습니다. 표준과 납품업자의 준수는 시대의 최고의 꽤 모호합니다. 그것의 가치, "LIMIT는"예약 된 단어로 나열 무엇을 위해 (이 구현에 키워드 아니라 어디 법적으로도 경우에 식별자로 사용할 수 없습니다 의미).
-
==============================
7.그것은 더 많거나 적은 MySQL과 PostgreSQL을 제한됩니다 LIMIT 그 해답 중 하나에 언급 된 OFFSET 이후, 나는 또한 LIMIT와 OFFSET 절을 지원하는 SAP의 HANA를 지적 생각했다. 그러나 LIMIT없이 OFFSET은 SAP의 HANA 데이터베이스에 허용되지 않습니다.
그것은 더 많거나 적은 MySQL과 PostgreSQL을 제한됩니다 LIMIT 그 해답 중 하나에 언급 된 OFFSET 이후, 나는 또한 LIMIT와 OFFSET 절을 지원하는 SAP의 HANA를 지적 생각했다. 그러나 LIMIT없이 OFFSET은 SAP의 HANA 데이터베이스에 허용되지 않습니다.
from https://stackoverflow.com/questions/1528604/how-universal-is-the-limit-statement-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 테이블이 비어있는 경우 INSERT를 실행? (0) | 2020.06.13 |
---|---|
[SQL] 어떻게 SQL Server의 저장 프로 시저에서 CSV 출력 파일을 생성합니다 (0) | 2020.06.13 |
[SQL] PDO와 함께 LIKE에 대한 명명 된 매개 변수를 사용하여 (0) | 2020.06.13 |
[SQL] 팬더 쿼리 기능은 열 이름에 공백이 작동하지 않습니다 (0) | 2020.06.13 |
[SQL] FROM INSERT INTO [임시 테이블]에 MySQL을 어떻게 [저장 프로 시저] (0) | 2020.06.13 |