[sql] SQL Server로 LIMIT를 구현하는 방법은 무엇입니까?

MySQL 에서이 쿼리가 있습니다.

select * from table1 LIMIT 10,20

SQL Server에서이 작업을 어떻게 수행 할 수 있습니까?



답변

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


답변

어리석은 일이지만 효과가 있습니다.

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

MSSQL의 LIMIT 절 누락은 형사 IMO입니다. 이런 종류의 복잡한 해결 방법을 수행하지 않아도됩니다.


답변

SQL SERVER 2012부터 OFFSET FETCH 절을 사용할 수 있습니다.

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

by by가 고유하지 않으면 올바르게 작동하지 않을 수 있습니다.

조회가 ORDER BY OrderDate로 수정되면 리턴 된 결과 세트가 예상과 다릅니다.


답변

이것은 10 월에 제가 물었던 질문과 거의 같습니다 :
Microsoft SQL Server 2000의 MySQL LIMIT 절 에뮬레이션

Microsoft SQL Server 2000을 사용하는 경우 좋은 해결책이 없습니다. 대부분의 사람들은 IDENTITY기본 키를 사용하여 임시 테이블에서 쿼리 결과를 캡처해야 합니다. 그런 다음 BETWEEN조건을 사용하여 기본 키 열에 대해 쿼리하십시오 .

Microsoft SQL Server 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의 답변에 표시된 것처럼 이것을 공통 테이블 표현식 으로 작성할 수도 있습니다 .


답변

이것이 MS SQL Server 2012의 결과를 제한하는 방법입니다.

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

참고 : OFFSET와 함께 또는 함께 사용할 수 있습니다 ORDER BY.

코드 줄을 설명하려면 OFFSET xx ROWS FETCH NEXT yy ROW ONLY

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

yy당신이 테이블에서 끌어 할 기록 / 행의 수입니다.

이전 예제를 빌드하려면 다음을 수행하십시오. 테이블 1에 40 개의 레코드가 있고 10 행에서 가져 오기 시작하고 NEXT 세트 10 ( yy)을 가져 오십시오 . 즉, 위의 코드는 행 10에서 시작하여 20에서 끝나는 테이블 1에서 레코드를 가져옵니다. 따라서 행 10-20을 가져옵니다.

OFFSET 에 대한 자세한 정보는 링크를 확인하십시오.


답변

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


답변

문법적으로 MySQL LIMIT 쿼리는 다음과 같습니다 :

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

이것은 다음과 같은 Microsoft SQL Server로 번역 될 수 있습니다

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

이제 쿼리 select * from table1 LIMIT 10,20는 다음과 같습니다.

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