복붙노트

[SQL] 어떻게 마이크로 소프트 SQL 서버와 LIMIT를 구현하는 방법?

SQL

어떻게 마이크로 소프트 SQL 서버와 LIMIT를 구현하는 방법?

나는 MySQL은이 쿼리를 가지고 :

select * from table1 LIMIT 10,20

어떻게 마이크로 소프트 SQL로이 작업을 수행 할 수 있습니까?

해결법

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

    1.SQL Server 2005의 시작, 당신은이 작업을 수행 할 수 있습니다 ...

    SQL Server 2005의 시작, 당신은이 작업을 수행 할 수 있습니다 ...

    USE AdventureWorks;
    GO
    WITH OrderedOrders AS
    (
        SELECT SalesOrderID, OrderDate,
        ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
        FROM Sales.SalesOrderHeader 
    ) 
    SELECT * 
    FROM OrderedOrders 
    WHERE RowNumber BETWEEN 10 AND 20;
    

    2000 및 버전 다음과 같은 또는 뭔가 ...

    SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC
    
  2. ==============================

    2.투박하지만, 그것은 작동합니다.

    투박하지만, 그것은 작동합니다.

    SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id
    

    제한 조항의 MSSQL의 생략은 IMO, 범죄입니다. 당신은 미봉책 해결 이런 종류의 작업을 수행 할 필요가 없습니다.

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

    3.SQL 서버 2012을 시작으로, 당신은이 절을 FETCH OFFSET 사용할 수 있습니다 :

    SQL 서버 2012을 시작으로, 당신은이 절을 FETCH OFFSET 사용할 수 있습니다 :

    USE AdventureWorks;
    GO
    SELECT SalesOrderID, OrderDate
    FROM Sales.SalesOrderHeader 
    ORDER BY SalesOrderID
        OFFSET 10 ROWS
        FETCH NEXT 10 ROWS ONLY;
    GO
    

    http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx

    에 의해 순서가 고유하지 않은 경우에 제대로 작동하지 않을 수 있습니다.

    하여 쿼리에 ORDER BY 주문일로 변경되었을 경우, 결과 세트는 예상되지 않는다 돌아왔다.

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

    4.이것은 내가 10 월에 묻는 질문의 거의 중복 : 마이크로 소프트 SQL 서버 2000 에뮬레이션 MySQL의 LIMIT 절

    이것은 내가 10 월에 묻는 질문의 거의 중복 : 마이크로 소프트 SQL 서버 2000 에뮬레이션 MySQL의 LIMIT 절

    당신은 마이크로 소프트 SQL 서버 2000을 사용하는 경우, 더 좋은 솔루션이 없습니다. 대부분의 사람들은 IDENTITY 기본 키와 임시 테이블에서 쿼리의 결과를 캡처에 의존해야합니다. 그런 다음 기본 키 컬럼에 대한 쿼리는 상태 사이를 사용.

    당신은 마이크로 소프트 SQL 서버 2005을 사용하고있는 이상, 당신은 ROW_NUMBER () 함수가있는 경우, 그래서 당신은 동일한 결과를 얻을 수 있지만, 임시 테이블을 방지 할 수 있습니다.

    SELECT t1.*
    FROM (
        SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
        FROM ( ...original SQL query... ) t1
    ) t2
    WHERE t2.row BETWEEN @offset+1 AND @offset+@count;
    

    @Leon Tayson의 대답과 같이 당신은 또한 공통 테이블 식으로 이것을 쓸 수 있습니다.

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

    5.이것은 내가 MS SQL 서버 2012 년 결과를 제한하는 방법이다 :

    이것은 내가 MS SQL 서버 2012 년 결과를 제한하는 방법이다 :

    SELECT * 
    FROM table1
    ORDER BY columnName
      OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
    

    참고 : 오프셋은 단지 또는 탠덤에서 ORDER BY를 사용할 수 있습니다.

    OFFSET XX 행이 다음 전년 동기 대비 ROW 만 페치 코드 라인을 설명하기

    사람 XX는 테이블, 즉에서에서 당겨 시작하려는 레코드 / 행 번호입니다 : 표 1 (40 개) 기록이있는 경우, 위의 코드는 행 (10)으로부터 당겨 시작됩니다.

    전년는 테이블에서 끌어 할 기록 / 행의 수입니다.

    표 1은 (40 개) 기록을 가지고 있으며, 당신이 행 (10)으로부터 당겨 시작하면 10 (전년 동기 대비)의 다음 세트를 잡아 : 앞의 예에 구축합니다. (20) - 즉, 의미, 위 코드 10 행에서 시작하여 20 당기는 따라서 행 10에서 끝나는 표 1로부터 레코드를 당길 것이다.

    OFFSET에 대한 추가 정보에 대한 링크를 확인하세요

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

    6.

    SELECT  *
    FROM    (
            SELECT  TOP 20
                    t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
            FROM    table1 t
            ORDER BY
                    field1
            ) t
    WHERE   rn > 10
    
  7. ==============================

    7.구문 MySQL의 LIMIT 쿼리는 다음과 같이이다 :

    구문 MySQL의 LIMIT 쿼리는 다음과 같이이다 :

    SELECT * FROM table LIMIT OFFSET, ROW_COUNT
    

    이 같은 마이크로 소프트 SQL 서버로 변환 할 수 있습니다

    SELECT * FROM 
    (
        SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
        FROM table
    ) a
    WHERE rnum > OFFSET
    

    이제 쿼리는 다음과 같이 될 것입니다 표 1의 LIMIT 10, 20 SELECT * FROM :

    SELECT * FROM 
    (
        SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
        FROM table1
    ) a
    WHERE rnum > 10 
    
  8. ==============================

    8.이것은 내가 MS 서버를 사용하여 피하려고하는 이유 중 하나 ...하지만 어쨌든입니다. 가끔은 그냥 (YEI! 나는 오래된 버전을 사용해야합니다!) 옵션이 없습니다.

    이것은 내가 MS 서버를 사용하여 피하려고하는 이유 중 하나 ...하지만 어쨌든입니다. 가끔은 그냥 (YEI! 나는 오래된 버전을 사용해야합니다!) 옵션이 없습니다.

    나의 제안은 가상 테이블을 만드는 것입니다 :

    에서:

    SELECT * FROM table
    

    에:

    CREATE VIEW v_table AS    
        SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
    

    그럼 그냥 쿼리 :

    SELECT * FROM v_table WHERE row BETWEEN 10 AND 20
    

    필드를 추가하거나 제거하는 경우, "행"자동으로 업데이트됩니다.

    이 옵션을 가장 큰 문제는 ORDER BY가 고정되어 있다는 점이다. 다른 주문을 원한다면, 당신은 다른 뷰를 작성해야합니다.

    최신 정보

    이 방법의 또 다른 문제가 있습니다 : 당신이 당신의 데이터를 필터링하려고하면 예상대로 작동하지 않습니다. 예를 들어, 당신이 할 경우 :

    SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20
    

    (대신에 전체 데이터 세트를 검색하고 출력을 제한) (10, 20) 사이의 행에 해당 데이터에 한정된다 WHERE.

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

    9.이것은 SQL 2000에서 작동하는 다중 단계 접근 방식입니다.

    이것은 SQL 2000에서 작동하는 다중 단계 접근 방식입니다.

    -- Create a temp table to hold the data
    CREATE TABLE #foo(rowID int identity(1, 1), myOtherColumns)
    
    INSERT INTO #foo (myColumns) SELECT myData order By MyCriteria
    
    Select * FROM #foo where rowID > 10
    
  10. ==============================

    10.

    SELECT 
        * 
    FROM 
        (
            SELECT 
                top 20              -- ($a) number of records to show
                * 
            FROM
                (
                    SELECT 
                        top 29      -- ($b) last record position
                        * 
                    FROM 
                        table       -- replace this for table name (i.e. "Customer")
                    ORDER BY 
                        2 ASC
                ) AS tbl1 
            ORDER BY 
                2 DESC
        ) AS tbl2 
    ORDER BY 
        2 ASC;
    
    -- Examples:
    
    -- Show 5 records from position 5:
    -- $a = 5;
    -- $b = (5 + 5) - 1
    -- $b = 9;
    
    -- Show 10 records from position 4:
    -- $a = 10;
    -- $b = (10 + 4) - 1
    -- $b = 13;
    
    -- To calculate $b:
    -- $b = ($a + position) - 1
    
    -- For the present exercise we need to:
    -- Show 20 records from position 10:
    -- $a = 20;
    -- $b = (20 + 10) - 1
    -- $b = 29;
    
  11. ==============================

    11.꼭 해봐. 아래 쿼리에서, 당신은에 의해 그룹, 건너 뛰기 행 및 제한 행에 의해 순서를 볼 수 있습니다.

    꼭 해봐. 아래 쿼리에서, 당신은에 의해 그룹, 건너 뛰기 행 및 제한 행에 의해 순서를 볼 수 있습니다.

    select emp_no , sum(salary_amount) from emp_salary
    Group by emp_no 
    ORDER BY emp_no 
    OFFSET 5 ROWS       -- Skip first 5 
    FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows
    
  12. ==============================

    12.SQL에서 존재 키워드에는 제한이 없습니다. 당신은 단지 행의 수를 제한해야 할 경우 당신은 LIMIT 유사한 TOP 키워드를 사용해야합니다.

    SQL에서 존재 키워드에는 제한이 없습니다. 당신은 단지 행의 수를 제한해야 할 경우 당신은 LIMIT 유사한 TOP 키워드를 사용해야합니다.

  13. ==============================

    13.당신의 ID가 고유 식별자 유형이 또는 테이블에 ID가 정렬되지 않은 경우이 아래와 같이 수행해야합니다.

    당신의 ID가 고유 식별자 유형이 또는 테이블에 ID가 정렬되지 않은 경우이 아래와 같이 수행해야합니다.

    select * from
    (select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
    where a.RowNumber between 2 and 5
    

    코드가 될 것입니다

    select * from limit 2,5
  14. ==============================

    14.

    SELECT * FROM
    (
        SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
    ) as a
    WHERE [Count] BETWEEN 10 and 20;
    

    기둥 [카운트] --Giving 당신이 당신의 한계를 제공 할 수있는 다시 선택 다시 모든 행을 주문 뭔가없는 고유 계산을 할당 .. :)

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

    15.아래와 같은 결과를 얻을 수있는 가능한 방법 중 하나는,이 의지의 도움을 바랍니다.

    아래와 같은 결과를 얻을 수있는 가능한 방법 중 하나는,이 의지의 도움을 바랍니다.

    declare @start int
    declare @end int
    SET @start = '5000';  -- 0 , 5000 ,
    SET @end = '10000'; -- 5001, 10001
    SELECT * FROM ( 
      SELECT TABLE_NAME,TABLE_TYPE, ROW_NUMBER() OVER (ORDER BY TABLE_NAME) as row FROM information_schema.tables
     ) a WHERE a.row > @start and a.row <= @end
    
  16. ==============================

    16.쉬운 방법

    쉬운 방법

    MYSQL :

    SELECT 'filds' FROM 'table' WHERE 'where' LIMIT 'offset','per_page'
    

    MSSQL :

    SELECT 'filds' FROM 'table' WHERE 'where' ORDER BY 'any' OFFSET 'offset' 
    ROWS FETCH NEXT 'per_page' ROWS ONLY
    

    ORDER BY는 필수입니다

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

    17.

    SELECT TOP 10 * FROM table;
    

    와 같다

    SELECT * FROM table LIMIT 0,10;
    

    여기에 특별히 MSSQL 그것의 의견을 멋진 읽기 제한을 구현하는 방법에 대한 기사입니다.

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

    18.내가 제대로 기억한다면이 같은 것을 사용할 수 있습니다 (내가 SQL Server에 발랐어요 이후 동안은 지났지) : (2005 년까지)를

    내가 제대로 기억한다면이 같은 것을 사용할 수 있습니다 (내가 SQL Server에 발랐어요 이후 동안은 지났지) : (2005 년까지)를

    SELECT
        *
       ,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
    FROM SomeTable
    WHERE RowNum BETWEEN 10 AND 20
    
  19. from https://stackoverflow.com/questions/603724/how-to-implement-limit-with-microsoft-sql-server by cc-by-sa and MIT license