[sql] SQL Server의 LIMIT 10..20

나는 다음과 같은 일을하려고합니다.

SELECT * FROM table LIMIT 10,20

또는

SELECT * FROM table LIMIT 10 OFFSET 10

그러나 SQL Server 사용

내가 찾은 유일한 솔루션 은 과잉처럼 보입니다.

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE row > 5 and row <= 10

나는 또한 발견했다 :

SELECT TOP 10 * FROM stuff; 

…하지만 시작 한계를 지정할 수 없기 때문에 내가하고 싶은 것이 아닙니다.

내가 할 수있는 또 다른 방법이 있습니까?

또한 궁금한 점이 있는데 SQL Server가 LIMIT함수 또는 이와 유사한 기능을 지원하지 않는 이유가 있습니까? 나는 의미가되고 싶지 않지만 DBMS가 필요로하는 것처럼 들린다. 만약 그렇다면, 그렇게 무지한 것이 유감 스럽다! 지난 5 년간 MySQL 및 SQL +와 함께 일해 왔습니다.



답변

LIMIT절은 표준 SQL의 일부가 아닙니다. MySQL, PostgreSQL 및 SQLite에서 SQL에 대한 공급 업체 확장으로 지원됩니다.

다른 브랜드의 데이터베이스는 유사한 기능 (예 : TOPMicrosoft SQL Server)을 가질 수 있지만 항상 동일하게 작동하지는 않습니다.

조항 TOP을 모방하기 위해 Microsoft SQL Server에서 사용하기가 어렵습니다 LIMIT. 작동하지 않는 경우가 있습니다.

사용하여 표시 한 솔루션 ROW_NUMBER()은 Microsoft SQL Server 2005 이상에서 사용할 수 있습니다. 이것은 쿼리의 일부로 만 작동하는 (현재로서는) 최상의 솔루션입니다.

또 다른 해결책은 TOP첫 번째 카운트 + 오프셋 행을 가져온 다음 API를 사용하여 첫 번째 오프셋 행을 지나서 찾는 것 입니다.

또한보십시오:


답변

SQL Server 2012 +의 경우을 사용할 수 있습니다 .

SELECT  *
FROM     sys.databases
ORDER BY name 
OFFSET  5 ROWS 
FETCH NEXT 5 ROWS ONLY 


답변

알다시피, 이것은 선호되는 SQL 서버 방법입니다.

SELECT * FROM ( 
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases 
 ) a WHERE a.row > 5 and a.row <= 10


답변

Martin Smith의 답변에 대해 SQL Server 2012 이상 투표를 사용 OFFSET하고에 FETCH NEXT확장명을 사용하는 경우 ORDER BY,

불행히도 이전 버전을 고수 할 수 있다면 다음과 같이 할 수 있습니다.

WITH Rows AS
(
    SELECT
              ROW_NUMBER() OVER (ORDER BY [dbo].[SomeColumn]) [Row]
            , *
        FROM
              [dbo].[SomeTable]
)
SELECT TOP 10
          *
     FROM
         Rows
    WHERE Row > 10

나는 기능적이라고 생각합니다

SELECT * FROM SomeTable LIMIT 10 OFFSET 10 ORDER BY SomeColumn

그리고 MS SQL 2012 이전에 TSQL에서 내가 아는 최고의 성능.


행이 매우 많은 경우 CTE 대신 임시 테이블을 사용하여 성능을 향상시킬 수 있습니다.


답변

불행히도, ROW_NUMBER()당신이 할 수있는 최선입니다. limitor top절의 결과는 특정 순서와 관계없이 의미가 없기 때문에 실제로 더 정확합니다 . 그러나 여전히 고통 스럽습니다.

업데이트 : Sql Server 2012는 OFFSET 및 FETCH 키워드limit 를 통해 유사한 기능을 추가합니다 . 이는 표준 이 아닌 MySql 확장 인와 반대로 ansi-standard 방식 입니다.LIMIT


답변

이건 어때요?

SET ROWCOUNT 10

SELECT TOP 20 *
FROM sys.databases
ORDER BY database_id DESC

처음 20 개 행 중 마지막 10 개 행을 제공합니다. 한 가지 단점은 순서가 반대로되어 있지만 적어도 기억하기 쉽다는 것입니다.


답변

SELECT TOP 10 *
FROM TABLE
WHERE IDCOLUMN NOT IN (SELECT TOP 10 IDCOLUMN FROM TABLE)

기록 11-20을 제공해야합니다. 추가 페이지를 얻기 위해 증분하는 경우에는 너무 비효율적이며 주문에 의해 어떻게 영향을받을 수 있는지 확실하지 않습니다. WHERE 문에서 이것을 지정해야 할 수도 있습니다.