[SQL] SQL 서버에서 오프셋 행
SQLSQL 서버에서 오프셋 행
A는 지정된 오프셋 (offset) 시작하는 결과를 얻을 수있는 SQL Server의 방법이 있습니까? 예를 들어, SQL 데이터베이스의 또 다른 유형, 그것은 할 수있다 :
SELECT * FROM MyTable OFFSET 50 LIMIT 25
결과 51-75를 얻을 수 있습니다. 이 구조는 SQL 서버에 존재하는 표시되지 않습니다.
어떻게이 나는 걱정하지 않는다 모든 행을로드하지 않고 달성 할 수 있습니까? 감사!
해결법
-
==============================
1.나는 SELECT *를 사용하지 않는 것입니다. 당신이 실제로 그들 모두 할 수있다하더라도 원하는 열을 지정합니다.
나는 SELECT *를 사용하지 않는 것입니다. 당신이 실제로 그들 모두 할 수있다하더라도 원하는 열을 지정합니다.
SQL 서버 2005 +
SELECT col1, col2 FROM ( SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM MyTable ) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow
SQL Server 2000의
효율적으로 SQL 서버 2000에서 대형 결과 세트를 통해 페이징
대형 결과 세트를 통해 페이징을위한보다 효율적인 방법
-
==============================
2.당신은 단순히 이전 페이지에서 볼 수있는 마지막 키 값을 기억하고 TOP (25) ... 사용하여 다음 순서에있는 모든 페이지를 처리 할 경우 WHERE 키> 적합한 인덱스가 허용 존재하는 경우 ORDER BY 키는 실적이 가장 좋은 방법이 될 수 있습니다 @last_key 이 효율적으로 탐색했습니다합니다 -하거나하지 않으면 커서 API를.
당신은 단순히 이전 페이지에서 볼 수있는 마지막 키 값을 기억하고 TOP (25) ... 사용하여 다음 순서에있는 모든 페이지를 처리 할 경우 WHERE 키> 적합한 인덱스가 허용 존재하는 경우 ORDER BY 키는 실적이 가장 좋은 방법이 될 수 있습니다 @last_key 이 효율적으로 탐색했습니다합니다 -하거나하지 않으면 커서 API를.
2008 R2 아마 ROW_NUMBER와 사이 - 임의의 페이지를 SQL Server에 대한 최상의 솔루션 2005을 선택
SQL Server의 경우 2012+이 필요에 대한 BY 절 개선 ORDER를 사용할 수 있습니다.
SELECT * FROM MyTable ORDER BY OrderingColumn ASC OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY
는 미지수지만 수행이 옵션을 얼마나 잘 될 것입니다.
-
==============================
3.이것은 하나의 방법입니다 (SQL2000)
이것은 하나의 방법입니다 (SQL2000)
SELECT * FROM ( SELECT TOP (@pageSize) * FROM ( SELECT TOP (@pageNumber * @pageSize) * FROM tableName ORDER BY columnName ASC ) AS t1 ORDER BY columnName DESC ) AS t2 ORDER BY columnName ASC
이것은 (2005 SQL) 또 다른 방법입니다
;WITH results AS ( SELECT rowNo = ROW_NUMBER() OVER( ORDER BY columnName ASC ) , * FROM tableName ) SELECT * FROM results WHERE rowNo between (@pageNumber-1)*@pageSize+1 and @pageNumber*@pageSize
-
==============================
4.당신은 당신이 원하는 것을 얻을 ROW_NUMBER () 함수를 사용할 수 있습니다 :
당신은 당신이 원하는 것을 얻을 ROW_NUMBER () 함수를 사용할 수 있습니다 :
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY id) RowNr, id FROM tbl) t WHERE RowNr BETWEEN 10 AND 20
-
==============================
5.이 SQL 서버 2012 FETCH ... OFFSET되어 있지만 열에 의해 순서를 지정해야합니다.
이 SQL 서버 2012 FETCH ... OFFSET되어 있지만 열에 의해 순서를 지정해야합니다.
당신이 정말로 (다른 제안으로) 당신이 열 BY 순서로 전달할 수 있음을 명시 적 열이없는 경우에, 당신은이 트릭을 사용할 수 있습니다 :
SELECT * FROM MyTable ORDER BY @@VERSION OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY
... 또는
SELECT * FROM MyTable ORDER BY (SELECT 0) OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY
사용자가 명시 적으로 순서를 지정하지 않을 때 우리는 jOOQ에서 그것을 사용하고 있습니다. 이 후 추가 비용없이 꽤 임의 순서를 생성합니다.
-
==============================
6.더 큰 데이터 열이있는 테이블의 경우, 내가 선호 :
더 큰 데이터 열이있는 테이블의 경우, 내가 선호 :
SELECT tablename.col1, tablename.col2, tablename.col3, ... FROM ( ( SELECT col1 FROM ( SELECT col1, ROW_NUMBER() OVER (ORDER BY col1 ASC) AS RowNum FROM tablename WHERE ([CONDITION]) ) AS T1 WHERE T1.RowNum BETWEEN [OFFSET] AND [OFFSET + LIMIT] ) AS T2 INNER JOIN tablename ON T2.col1=tablename.col1 );
-
[CONDITION] can contain any WHERE clause for searching. [OFFSET] specifies the start, [LIMIT] the maximum results.
ROW_NUMBER 함수가 하나 개의 칼럼을 통해보고있다, 만 일치하는 행이 모든 열이 반환되어 있기 때문에, BLOB를 같은 대용량 데이터가있는 테이블에 훨씬 더 나은 성능을 가지고있다.
-
==============================
7.매기기위한 나의 선택을 참조
매기기위한 나의 선택을 참조
SELECT TOP @limit * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY colunx ASC) offset, * FROM ( -- YOU SELECT HERE SELECT * FROM mytable ) myquery ) paginator WHERE offset > @offset
이것은 페이징 해결)
-
==============================
8.
SELECT TOP 75 * FROM MyTable EXCEPT SELECT TOP 50 * FROM MyTable
-
==============================
9.버전에 따라 당신이 직접 할 수는 없지만 같은 해키 뭔가를 할 수
버전에 따라 당신이 직접 할 수는 없지만 같은 해키 뭔가를 할 수
select top 25 * from ( select top 75 * from table order by field asc ) a order by field desc
여기서 '필드'의 핵심입니다.
-
==============================
10.SQL 서버 2012 년 처음 50 기록의 작품을 제외하고 25 개 레코드를 표시합니다 다음.
SQL 서버 2012 년 처음 50 기록의 작품을 제외하고 25 개 레코드를 표시합니다 다음.
SELECT * FROM MyTable ORDER BY ID OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;
당신은 당신의 필요 조건으로 ID를 대체 할 수
-
==============================
11.성능이 매우 가난으로 ROW_NUMBER () OVER (주문 BY) 문을 사용할 때주의해야합니다. 같은 더 악화입니다) ROW_NUMBER와 공통 테이블 식을 (사용 간다. 나는 빠른 페이지 번호를 제공하기 위해 신원과 테이블 변수를 사용하는 것보다 약간 것으로 입증되었습니다 다음 코드를 사용하고 있습니다.
성능이 매우 가난으로 ROW_NUMBER () OVER (주문 BY) 문을 사용할 때주의해야합니다. 같은 더 악화입니다) ROW_NUMBER와 공통 테이블 식을 (사용 간다. 나는 빠른 페이지 번호를 제공하기 위해 신원과 테이블 변수를 사용하는 것보다 약간 것으로 입증되었습니다 다음 코드를 사용하고 있습니다.
DECLARE @Offset INT = 120000 DECLARE @Limit INT = 10 DECLARE @ROWCOUNT INT = @Offset+@Limit SET ROWCOUNT @ROWCOUNT SELECT * FROM MyTable INTO #ResultSet WHERE MyTable.Type = 1 SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY SortConst ASC) As RowNumber FROM ( SELECT *, 1 As SortConst FROM #ResultSet ) AS ResultSet ) AS Page WHERE RowNumber BETWEEN @Offset AND @ROWCOUNT DROP TABLE #ResultSet
-
==============================
12.나는 페이지 매기기에이 기술을 사용합니다. 나는 모든 행을 가져 오지 않습니다. 내 페이지 상단 100 행을 표시 할 필요가있는 경우 예를 들어, 나는 where 절에서만 100를 가져옵니다. 는 SQL의 출력은 고유 키가 있어야합니다.
나는 페이지 매기기에이 기술을 사용합니다. 나는 모든 행을 가져 오지 않습니다. 내 페이지 상단 100 행을 표시 할 필요가있는 경우 예를 들어, 나는 where 절에서만 100를 가져옵니다. 는 SQL의 출력은 고유 키가 있어야합니다.
표는 다음이 있습니다 :
ID, KeyId, Rank
같은 순위는 하나 이상의 -a Keyid 키 ID에 할당됩니다.
SQL은 표에서 선택 상위 2 * 여기서 순위> = @Rank 및 ID> @Id
처음으로 나는 모두 0을 전달합니다. 두번째는 .... 1 및 제 3 시간은 2 및 6을 통과 통과
10 기록 순위 & ID의 값은 다음에 전달
11 21 1 14 22 1 7 11 1 6 19 2 12 31 2 13 18 2
이 시스템에 최소한의 스트레스를해야합니다
-
==============================
13.는 SQL Server 2005에서는 다음을 수행 할 수 있습니다 :
는 SQL Server 2005에서는 다음을 수행 할 수 있습니다 :
DECLARE @Limit INT DECLARE @Offset INT SET @Offset = 120000 SET @Limit = 10 SELECT * FROM ( SELECT row_number() OVER (ORDER BY column) AS rownum, column2, column3, .... columnX FROM table ) AS A WHERE A.rownum BETWEEN (@Offset) AND (@Offset + @Limit-1)
-
==============================
14.주문 기록에 시간을 낭비하지 않고 그것을 할 수있는 가장 좋은 방법은 다음과 같이이다 :
주문 기록에 시간을 낭비하지 않고 그것을 할 수있는 가장 좋은 방법은 다음과 같이이다 :
select 0 as tmp,Column1 from Table1 Order by tmp OFFSET 5000000 ROWS FETCH NEXT 50 ROWS ONLY
그것은 1 초 미만 걸립니다! 큰 테이블을위한 최고의 솔루션입니다.
-
==============================
15.나는 (일반 쿼리) 잠시 지금이 응답에 대한 검색 및 2000 + SQL Server에서 그 일을 ROWCOUNT 및 커서와 TOP 또는 임시 테이블없이 사용의 또 다른 방법을 발견했습니다.
나는 (일반 쿼리) 잠시 지금이 응답에 대한 검색 및 2000 + SQL Server에서 그 일을 ROWCOUNT 및 커서와 TOP 또는 임시 테이블없이 사용의 또 다른 방법을 발견했습니다.
[+ LIMIT OFFSET] 다음 SET ROWCOUNT를 사용하면 결과를 제한 할 수 있고, 커서, 당신이 원하는 행, 마지막까지 다음 루프 '로 바로 이동합니다.
쿼리는 다음과 같이 될 것이다 그래서 :
SET ROWCOUNT 75 -- (50 + 25) DECLARE MyCursor SCROLL CURSOR FOR SELECT * FROM pessoas OPEN MyCursor FETCH ABSOLUTE 50 FROM MyCursor -- OFFSET WHILE @@FETCH_STATUS = 0 BEGIN FETCH next FROM MyCursor END CLOSE MyCursor DEALLOCATE MyCursor SET ROWCOUNT 0
from https://stackoverflow.com/questions/187998/row-offset-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] LIMIT의 등가 및 SQL Server에 대한 OFFSET? (0) | 2020.03.11 |
---|---|
[SQL] 어떻게 오라클에서 시퀀스를 재설정합니까? (0) | 2020.03.11 |
[SQL] SET NOCOUNT ON 사용 (0) | 2020.03.11 |
[SQL] SQL은 행에서 여러 테이블 대에 가입 왼쪽? (0) | 2020.03.11 |
[SQL] java.sql.Date 대 java.util.Date (0) | 2020.03.11 |