복붙노트

[SQL] 어떻게 SQL 데이터베이스 테이블에서 n 번째 행을 선택하려면?

SQL

어떻게 SQL 데이터베이스 테이블에서 n 번째 행을 선택하려면?

나는 데이터베이스 테이블에서 n 번째 행을 선택의 일부 (이상적) 데이터베이스 무신론자 방법을 학습에 관심이 있어요. 또한 이것은 다음 데이터베이스의 기본 기능을 사용하여 달성 할 수있는 방법을보고 재미있을 것입니다 :

나는 현재 SQL Server 2005의 다음과 같은 일을하고 있어요,하지만 난 다른의 더 많은 무신론자 접근 방법을보고 관심이있을 것입니다 :

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

위의 SQL에 대한 신용 : Firoz 안사의 웹 로그

업데이트 : SQL 표준에 대한 참조 Troels 아빈의 대답. Troels, 당신은 우리가 인용 수있는 링크를 가지고 있나요?

해결법

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

    1.이 표준의 옵션 부분에서이 일을하는 방법이 있지만, 데이터베이스의 많은 그 일을 자신의 방법을 지원합니다.

    이 표준의 옵션 부분에서이 일을하는 방법이 있지만, 데이터베이스의 많은 그 일을 자신의 방법을 지원합니다.

    이것과 다른 것들에 대해 이야기 정말 좋은 사이트는 http://troels.arvin.dk/db/rdbms/#select-limit입니다.

    기본적으로, PostgreSQL을하고 MySQL은 비 표준 지원

    SELECT...
    LIMIT y OFFSET x 
    

    오라클, DB2 및 MSSQL 표준 윈도우 기능을 지원합니다 :

    SELECT * FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
        columns
      FROM tablename
    ) AS foo
    WHERE rownumber <= n
    

    (난 그냥 그 DB를 사용하지 않습니다 때문에 위의 링크 된 사이트에서 복사 한)

    업데이트 : PostgreSQL의 8.4 윈도 기능이 지원되는 표준으로, 그래서 PostgreSQL을위한 일에 두 번째 예제를뿐만 아니라 기대합니다.

    업데이트 : SQLite는 추가 윈도우 함수는 두 형태 SQLite는의도 일 때문에 2018년 9월 15일에 버전 3.25.0에서 지원합니다.

  2. ==============================

    2.PostgreSQL의 SQL 표준에 의해 정의 된 기능을 윈도 지원하지만, 그래서 대부분의 사람들이 어색하게 사용할 수있는 거 (비표준) LIMIT는 / OFFSET :

    PostgreSQL의 SQL 표준에 의해 정의 된 기능을 윈도 지원하지만, 그래서 대부분의 사람들이 어색하게 사용할 수있는 거 (비표준) LIMIT는 / OFFSET :

    SELECT
        *
    FROM
        mytable
    ORDER BY
        somefield
    LIMIT 1 OFFSET 20;
    

    이 예에서는, 21 행을 선택한다. OFFSET (20)는 처음 20 개 기록을 건너 포스트 그레스을 말하고있다. 당신이 ORDER BY 절을 지정하지 않으면, 거의 유용하다 다시 얻을 것이다 기록 보장은 없습니다.

  3. ==============================

    3.나는 나머지의 대한 모르겠지만, SQLite는과 MySQL이 어떤 "기본"행 순서가없는 것을 알고있다. 그 두 방언에서, 적어도 다음 코드는 추가 된 날짜 / 시간으로 정렬, the_table에서 15 항목을 잡고 :

    나는 나머지의 대한 모르겠지만, SQLite는과 MySQL이 어떤 "기본"행 순서가없는 것을 알고있다. 그 두 방언에서, 적어도 다음 코드는 추가 된 날짜 / 시간으로 정렬, the_table에서 15 항목을 잡고 :

    SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15
    

    (... 물론, 당신은 추가 DATETIME 필드가 필요 했어, 그리고 항목이 추가 된 날짜 / 시간으로 설정)

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

    4.위의 SQL 2005와 내장이 기능이 있습니다. ROW_NUMBER () 함수를 사용합니다. 그것은 << 이전 및 다음 >> 스타일의 브라우징 웹 페이지에 대한 우수 :

    위의 SQL 2005와 내장이 기능이 있습니다. ROW_NUMBER () 함수를 사용합니다. 그것은 << 이전 및 다음 >> 스타일의 브라우징 웹 페이지에 대한 우수 :

    통사론:

    SELECT
        *
    FROM
        (
            SELECT
                ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
                *
            FROM
                Table_1
        ) sub
    WHERE
        RowNum = 23
    
  5. ==============================

    5.나는이 격렬하게 비효율적이다하지만 난 그것을 시도하는 작은 데이터 세트에 근무 아주 간단한 방법이다 생각한다.

    나는이 격렬하게 비효율적이다하지만 난 그것을 시도하는 작은 데이터 세트에 근무 아주 간단한 방법이다 생각한다.

    select top 1 field
    from table
    where field in (select top 5 field from table order by field asc)
    order by field desc
    

    이것은 5 항목을 얻을 다른 n 번째 아이템을 얻을 수있는 두 번째 상위 번호를 변경하는 것

    SQL 서버 전용 (내 생각)하지만 ROW_NUMBER를 지원하지 않는 이전 버전에서 작동한다 ().

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

    6.1 작은 변화 : N-1 N 대신.

    1 작은 변화 : N-1 N 대신.

    select *
    from thetable
    limit n-1, 1
    
  7. ==============================

    7.SQL 서버에 확인 :

    SQL 서버에 확인 :

    Select top 10 * From emp 
    EXCEPT
    Select top 9 * From emp
    

    이것은 당신에게 EMP 테이블의 10 행을 줄 것이다!

  8. ==============================

    8.답변 중 일부는 주장 것과는 반대로, SQL 표준이 주제에 대해 침묵하지 않습니다.

    답변 중 일부는 주장 것과는 반대로, SQL 표준이 주제에 대해 침묵하지 않습니다.

    SQL 이후 : 2003, 당신은 행과 한계 결과 집합을 건너 뛰려면 "윈도우 기능"을 사용할 수 있었다.

    그리고 SQL에 2008, 약간 간단한 방법은 사용하여 추가했다   OFFSET 스킵 행   FIRST의 N 행만을 FETCH

    내가 ISO를했다 그렇다면, 나는 이미 오히려 큰 표준의 그것을 유지했을 2008 년의 또한 정말 필요했다 : 개인적으로, 나는 SQL이 있다고 생각하지 않습니다.

  9. ==============================

    9.우리는 MSSQL 2000 년 사업에 사용하는 경우, 우리는 우리가 "트리플 플립"라는 것을했다 :

    우리는 MSSQL 2000 년 사업에 사용하는 경우, 우리는 우리가 "트리플 플립"라는 것을했다 :

    EDITED

    DECLARE @InnerPageSize int
    DECLARE @OuterPageSize int
    DECLARE @Count int
    
    SELECT @Count = COUNT(<column>) FROM <TABLE>
    SET @InnerPageSize = @PageNum * @PageSize
    SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize)
    
    IF (@OuterPageSize < 0)
        SET @OuterPageSize = 0
    ELSE IF (@OuterPageSize > @PageSize)
        SET @OuterPageSize = @PageSize
    
    DECLARE @sql NVARCHAR(8000)
    
    SET @sql = 'SELECT * FROM
    (
        SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM
        (
            SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC
        ) AS t1 ORDER BY <column> DESC
    ) AS t2 ORDER BY <column> ASC'
    
    PRINT @sql
    EXECUTE sp_executesql @sql
    

    그것은 우아하지 않았다, 그리고 빨리 아니었지만, 그것은했다.

  10. ==============================

    10.정상에서 N 번째의 레코드를 선택

    정상에서 N 번째의 레코드를 선택

    SELECT * FROM (
    SELECT 
    ID, NAME, ROW_NUMBER() OVER(ORDER BY ID) AS ROW
    FROM TABLE 
    ) AS TMP 
    WHERE ROW = n
    

    아래에서, N 번째의 레코드를 선택

    SELECT * FROM (
    SELECT 
    ID, NAME, ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROW
    FROM TABLE 
    ) AS TMP 
    WHERE ROW = n
    
  11. ==============================

    11.신탁:

    신탁:

    select * from (select foo from bar order by foo) where ROWNUM = x
    
  12. ==============================

    12.오라클 12C에서, 당신은 ORDER BY와 OFFSET..FETCH..ROWS 옵션을 사용할 수 있습니다

    오라클 12C에서, 당신은 ORDER BY와 OFFSET..FETCH..ROWS 옵션을 사용할 수 있습니다

    예를 들어, 위에서 세번째 기록을 얻을 수 있습니다 :

    SELECT * 
    FROM   sometable
    ORDER BY column_name
    OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;
    
  13. ==============================

    13.여기에 귀하의 혼란의 빠른 솔루션입니다.

    여기에 귀하의 혼란의 빠른 솔루션입니다.

    SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1
    

    여기에 N = 3 등을 작성하여 N = 1, 넷째 마지막으로, 두 번째 마지막 N = 0을 작성하여 마지막 행을 얻을 수 있습니다.

    이 인터뷰를 통해 매우 일반적인 질문이 매우 간단하고 그것입니다.

    또한 당신은 금액, ID 또는 일부 숫자 정렬 순서 유 MySQL은 CAST 기능 갈 것보다를합니다.

    SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1
    

    여기서 N = 4를 충전함으로써 당신은 쇼핑 카트에 담기 테이블에서 최고 금액의 다섯 번째 마지막 기록을 얻을 수있을 것입니다. 당신은 당신의 필드와 테이블 이름에 맞게 및 솔루션을 마련 할 수 있습니다.

  14. ==============================

    14.더하다:

    더하다:

    LIMIT n,1
    

    그 결과 N에서 시작하여 하나 개의 결과로 결과를 제한합니다.

  15. ==============================

    15.당신은 MSSQL의 모든 10 행을 선택하려는 경우 예를 들어, 당신은 사용할 수 있습니다;

    당신은 MSSQL의 모든 10 행을 선택하려는 경우 예를 들어, 당신은 사용할 수 있습니다;

    SELECT * FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
      FROM TableName
    ) AS foo
    WHERE rownumber % 10 = 0
    

    그냥 여기 당신이 원하는 번호를 MOD 변경 수 (10)을.

  16. ==============================

    16.SQL Server의 경우, 행 번호로 이동하는 일반적인 방법은 같은 것입니다 :

    SQL Server의 경우, 행 번호로 이동하는 일반적인 방법은 같은 것입니다 :

    SET ROWCOUNT @row --@row = the row number you wish to work on.
    

    예를 들면 :

    set rowcount 20   --sets row to 20th row
    
    select meat, cheese from dbo.sandwich --select columns from table at 20th row
    
    set rowcount 0   --sets rowcount back to all rows
    

    이것은 20 행의 정보를 반환합니다. 이후에 행 개수 0에 넣어해야합니다.

  17. ==============================

    17.LIMIT N, 1 MS SQL 서버에서 작동하지 않습니다. 난 그냥 구문을 지원하지 않는 유일한 주요 데이터베이스에 대해 생각합니다. 그렇게 널리 될 것을 지원하고 있지만 공정을하기 위해, 그것은 SQL 표준의 일부가 아닙니다. SQL 서버 LIMIT를 제외한 모든에서 잘 작동합니다. SQL 서버의 경우, 나는 우아한 해결책을 찾을 수 없어.

    LIMIT N, 1 MS SQL 서버에서 작동하지 않습니다. 난 그냥 구문을 지원하지 않는 유일한 주요 데이터베이스에 대해 생각합니다. 그렇게 널리 될 것을 지원하고 있지만 공정을하기 위해, 그것은 SQL 표준의 일부가 아닙니다. SQL 서버 LIMIT를 제외한 모든에서 잘 작동합니다. SQL 서버의 경우, 나는 우아한 해결책을 찾을 수 없어.

  18. ==============================

    18.여기에 정렬 / 동적 페이징을 허용 나는 최근 오라클에 대한 쓴 SPROC의 일반 버전입니다 - HTH

    여기에 정렬 / 동적 페이징을 허용 나는 최근 오라클에 대한 쓴 SPROC의 일반 버전입니다 - HTH

    -- p_LowerBound = first row # in the returned set; if second page of 10 rows,
    --                this would be 11 (-1 for unbounded/not set)
    -- p_UpperBound = last row # in the returned set; if second page of 10 rows,
    --                this would be 20 (-1 for unbounded/not set)
    
    OPEN o_Cursor FOR
    SELECT * FROM (
    SELECT
        Column1,
        Column2
        rownum AS rn
    FROM
    (
        SELECT
            tbl.Column1,
            tbl.column2
        FROM MyTable tbl
        WHERE
            tbl.Column1 = p_PKParam OR
            tbl.Column1 = -1
        ORDER BY
            DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
            DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
            DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
            DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
    ))
    WHERE
        (rn >= p_lowerBound OR p_lowerBound = -1) AND
        (rn <= p_upperBound OR p_upperBound = -1);
    
  19. ==============================

    19.하지만 실제로는, 모든 처음부터 좋은 데이터베이스 디자인이 정말 그냥 응접실 트릭 아닌가요? 몇 번 나는 빠른 보고서를 만들기 위해 쿼리 오프 단순한 하나였다 다음과 같은 기능을 필요로했다. 실제 작업의 경우, 이와 같은 사용 트릭 문제를 초대합니다. 특정 행을 선택하는 것은 필요한 경우 단지 연속 값을 가진 열이 그것으로 할 수.

    하지만 실제로는, 모든 처음부터 좋은 데이터베이스 디자인이 정말 그냥 응접실 트릭 아닌가요? 몇 번 나는 빠른 보고서를 만들기 위해 쿼리 오프 단순한 하나였다 다음과 같은 기능을 필요로했다. 실제 작업의 경우, 이와 같은 사용 트릭 문제를 초대합니다. 특정 행을 선택하는 것은 필요한 경우 단지 연속 값을 가진 열이 그것으로 할 수.

  20. ==============================

    20.SQL 서버의 경우, 다음 표를주는에서 첫 번째 행을 반환합니다.

    SQL 서버의 경우, 다음 표를주는에서 첫 번째 행을 반환합니다.

    declare @rowNumber int = 1;
        select TOP(@rowNumber) * from [dbo].[someTable];
    EXCEPT
        select TOP(@rowNumber - 1) * from [dbo].[someTable];
    

    이 같은 뭔가 값을 통해 당신은 할 수 루프 :

    WHILE @constVar > 0
    BEGIN
        declare @rowNumber int = @consVar;
           select TOP(@rowNumber) * from [dbo].[someTable];
        EXCEPT
           select TOP(@rowNumber - 1) * from [dbo].[someTable];  
    
           SET @constVar = @constVar - 1;    
    END;
    
  21. ==============================

    21.사이베이스 SQL의 어느 곳에서 :

    사이베이스 SQL의 어느 곳에서 :

    SELECT TOP 1 START AT n * from table ORDER BY whatever
    

    순서에 따라 또는 그것의 의미를 잊지 마세요.

  22. ==============================

    22.T-SQL은 - 테이블에서 N 번째 RecordNumber 선택

    T-SQL은 - 테이블에서 N 번째 RecordNumber 선택

    select * from
     (select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber
    
    Where  RecordNumber --> Record Number to Select
           TableName --> To be Replaced with your Table Name
    

    의 경우 예를 들어, (5)에게 테이블 직원에서 일 레코드를 선택하는 쿼리가 있어야한다

    select * from
     (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5
    
  23. ==============================

    23.

    SELECT * FROM emp a
    WHERE  n = (SELECT COUNT( _rowid)
                  FROM emp b
                 WHERE a. _rowid >= b. _rowid);
    
  24. ==============================

    24.

    SELECT
        top 1 *
    FROM
        table_name
    WHERE
        column_name IN (
            SELECT
                top N column_name
            FROM
                TABLE
            ORDER BY
                column_name
        )
    ORDER BY
        column_name DESC
    

    나는 N 번째 행을 찾기 위해이 쿼리를 작성했습니다. 이 쿼리를 예로들 수

    SELECT
        top 1 *
    FROM
        Employee
    WHERE
        emp_id IN (
            SELECT
                top 7 emp_id
            FROM
                Employee
            ORDER BY
                emp_id
        )
    ORDER BY
        emp_id DESC
    
  25. ==============================

    25.믿을 수없는이 일을 실행하는 SQL 엔진을 찾을 수 ...

    믿을 수없는이 일을 실행하는 SQL 엔진을 찾을 수 ...

    WITH sentence AS
    (SELECT 
        stuff,
        row = ROW_NUMBER() OVER (ORDER BY Id)
    FROM 
        SentenceType
        )
    SELECT
        sen.stuff
    FROM sentence sen
    WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1
    
  26. ==============================

    26.내가처럼 당신은 캐시를 사용하는 경우에 아무것도 공상, 특별한 기능, ...

    내가처럼 당신은 캐시를 사용하는 경우에 아무것도 공상, 특별한 기능, ...

    SELECT TOP 1 * FROM (
      SELECT TOP n * FROM <table>
      ORDER BY ID Desc
    )
    ORDER BY ID ASC
    

    당신은 ID 열 또는 당신이 신뢰할 수있는 날짜 스탬프 열이 있음을 감안할 때.

  27. ==============================

    27.이것은 내가 DB2 SQL 내에서 할 거라고하는 방법이다, 나는 RRN이 (상대 레코드 수) O / S에 의해 테이블에 저장된다 믿는다

    이것은 내가 DB2 SQL 내에서 할 거라고하는 방법이다, 나는 RRN이 (상대 레코드 수) O / S에 의해 테이블에 저장된다 믿는다

    SELECT * FROM (                        
       SELECT RRN(FOO) AS RRN, FOO.*
       FROM FOO                         
       ORDER BY RRN(FOO)) BAR             
     WHERE BAR.RRN = recordnumber
    
  28. ==============================

    28.

    select * from 
    (select * from ordered order by order_id limit 100) x order by 
    x.order_id desc limit 1;
    

    첫 번째 선택 100 오름차순 순서로 행과 다음 두 번 데이터를 액세스 할 때 이것은 매우 비싼 성명 그러나 1로 하강 및 제한에 주문하여 마지막 행을 선택합니다.

  29. ==============================

    29.그것은 효율적으로, 당신은 그 위치에있는 행을 선택할 수) 0 적은 데이터베이스 레코드의 수보다 하나와 2 사이의 임의의 숫자를 생성) 한 필요 나 그 보인다. 일반적으로 당신이 원하는 얼마나 많은 행을 건너 뛰고 얼마나 많은 행을 지정하지만, 서로 다른 데이터베이스 다르게 이루어집니다 - 불행하게도, 다른 데이터베이스는 서로 다른 난수 생성기 및 결과 세트의 위치에서 행을 선택하는 여러 가지 방법이있다. 여기에 SQLite는 나를 위해 작동하는 무언가가있다 :

    그것은 효율적으로, 당신은 그 위치에있는 행을 선택할 수) 0 적은 데이터베이스 레코드의 수보다 하나와 2 사이의 임의의 숫자를 생성) 한 필요 나 그 보인다. 일반적으로 당신이 원하는 얼마나 많은 행을 건너 뛰고 얼마나 많은 행을 지정하지만, 서로 다른 데이터베이스 다르게 이루어집니다 - 불행하게도, 다른 데이터베이스는 서로 다른 난수 생성기 및 결과 세트의 위치에서 행을 선택하는 여러 가지 방법이있다. 여기에 SQLite는 나를 위해 작동하는 무언가가있다 :

    select * 
    from Table 
    limit abs(random()) % (select count(*) from Words), 1;
    

    그것은 한계 절에 하위 쿼리를 사용할 수있는에 의존 않습니다 (SQLite는에 LIMIT <건너 뛸 RECS>는, ), 특히 효율적인해야 테이블에 레코드의 수를 선택하면 데이터베이스의의 일부가되는 메타 데이터는하지만 데이터베이스의 구현에 따라 달라집니다. 또한, 쿼리가 실제로 N 번째 기록을 검색하기 전에 결과 집합을 구축 할 것인지는 모르겠지만, 나는 그것이 필요하지 않는 것을 희망한다. 내가 절에 "에 의해 순서"를 지정하고 있지 않다 있습니다. 데이터베이스가 결과 집합을 구축하지 않고 데이터베이스 자체에서 N 번째 기록을 얻을 수없는 경우 빠른 수 있습니다 인덱스에서 N 번째 기록하기 -이 인덱스를해야합니다 기본 키, 같은 "에 의해 순서"더 나은을 수 있습니다 .

  30. ==============================

    30.내가 SQL 서버에 대해이 기사에 본 가장 적합한 답

    내가 SQL 서버에 대해이 기사에 본 가장 적합한 답

    WITH myTableWithRows AS (
        SELECT (ROW_NUMBER() OVER (ORDER BY myTable.SomeField)) as row,*
        FROM myTable)
    SELECT * FROM myTableWithRows WHERE row = 3
    
  31. from https://stackoverflow.com/questions/16568/how-to-select-the-nth-row-in-a-sql-database-table by cc-by-sa and MIT license