복붙노트

[SQL] SQL의 LIMIT 문은 얼마나 보편적인가?

SQL

SQL의 LIMIT 문은 얼마나 보편적인가?

나는 장고 DB 복제 응용 프로그램을 일반화하는 과정에있어 그리고 그것은 문을 사용하여

SELECT %s FROM %s LIMIT 1

이 오라클과 MySQL과 벌금을 작동하지만, 한계 문이 방법 크로스 플랫폼, 1 개 행을 가져오고 필드를 설명하기 위해 파이썬 DBAPI를 사용 하는가?

해결법

  1. ==============================

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

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

    3.LIMIT는 아주 멀리 우주에서입니다 - 밖으로 주요 RDBMS의, 그것은 꽤 많은 MySQL과 PostgreSQL을 제한합니다. 다음은이가 MSSQL, Oracle 및 DB2를 포함하여 다른 많은 구현에서 수행뿐만 아니라 ANSI SQL의 방법에 대한 자세한 분석이다.

    LIMIT는 아주 멀리 우주에서입니다 - 밖으로 주요 RDBMS의, 그것은 꽤 많은 MySQL과 PostgreSQL을 제한합니다. 다음은이가 MSSQL, Oracle 및 DB2를 포함하여 다른 많은 구현에서 수행뿐만 아니라 ANSI SQL의 방법에 대한 자세한 분석이다.

  4. ==============================

    4.그것은 모든 보편적에서이 아니다. 사실은 내가 오전는 오라클에서 당신을 위해 노력하고 있습니다 놀라게; 그것은 존재하는 데 사용되지 않았다. 일반적으로 오라클 사용자는 ROWNUM에 대한 이동합니다.

    그것은 모든 보편적에서이 아니다. 사실은 내가 오전는 오라클에서 당신을 위해 노력하고 있습니다 놀라게; 그것은 존재하는 데 사용되지 않았다. 일반적으로 오라클 사용자는 ROWNUM에 대한 이동합니다.

    모든 데이터베이스는 행 번호로 결과를 제한하는 고유 한 구문이 있습니다. ANSI 표준 SQL있는 방법은 두 가지가 있습니다

    여기에 당신이 크로스 DBMS의 페이지 매김 지원을 원하는 경우 처리해야합니다 지루함의 좋은 개요입니다.

  5. ==============================

    5.그것은 (대신 ㅋ로부터 SELECT TOP 10 *를 사용하는) MSSQL에서 작동하지 않습니다. DB를 시장의 상당 부분 밖으로 그 잘라냅니다. 나는 다른 사람에 대해 확실하지 않다.

    그것은 (대신 ㅋ로부터 SELECT TOP 10 *를 사용하는) MSSQL에서 작동하지 않습니다. DB를 시장의 상당 부분 밖으로 그 잘라냅니다. 나는 다른 사람에 대해 확실하지 않다.

    또한, 귀하의 DB API는 당신을 위해 그것을 번역하는 것, 매우 가능성이 있지만, 가능합니다.

  6. ==============================

    6.LIMIT는 1992 년 표준과 ANSI SQL 표준의 일부가 아닙니다; 나는 손에 이후 표준의 사본이 없습니다. 표준과 납품업자의 준수는 시대의 최고의 꽤 모호합니다. 그것의 가치, "LIMIT는"예약 된 단어로 나열 무엇을 위해 (이 구현에 키워드 아니라 어디 법적으로도 경우에 식별자로 사용할 수 없습니다 의미).

    LIMIT는 1992 년 표준과 ANSI SQL 표준의 일부가 아닙니다; 나는 손에 이후 표준의 사본이 없습니다. 표준과 납품업자의 준수는 시대의 최고의 꽤 모호합니다. 그것의 가치, "LIMIT는"예약 된 단어로 나열 무엇을 위해 (이 구현에 키워드 아니라 어디 법적으로도 경우에 식별자로 사용할 수 없습니다 의미).

  7. ==============================

    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 데이터베이스에 허용되지 않습니다.

  8. from https://stackoverflow.com/questions/1528604/how-universal-is-the-limit-statement-in-sql by cc-by-sa and MIT license