PostgreSQL에는 결과 세트를 매우 쉽게 페이지 매김 할 수 있는 Limit
및 Offset
키워드가 있습니다.
SQL Server에 해당하는 구문은 무엇입니까?
PostgreSQL에는 결과 세트를 매우 쉽게 페이지 매김 할 수 있는 Limit
및 Offset
키워드가 있습니다.
SQL Server에 해당하는 구문은 무엇입니까?
답변:
의 상응 LIMIT
입니다 SET ROWCOUNT
,하지만 당신은 일반적인 매김을 할 경우이 같은 쿼리를 작성하는 것이 좋습니다 :
;WITH Results_CTE AS
(
SELECT
Col1, Col2, ...,
ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
FROM Table
WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @Offset
AND RowNum < @Offset + @Limit
페이징 옵션을 변경하거나 사용자가 변경하도록 허용 한 경우 오프셋 및 제한의 매개 변수화가 장점입니다.
참고 :@Offset
매개 변수는 정상 제로 인덱스보다이 아니라 하나 기반의 인덱싱을 사용해야합니다.
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
. MSSQL2008 R2.
Table
200k 개의 레코드가 있으면 먼저 모든 레코드를 가져온 다음 한도를 적용합니까? 이 쿼리는 효율적입니까?
이 기능은 이제 SQL Server 2012에서 쉽게 사용할 수 있습니다.이 기능은 SQL Server 2012부터 작동합니다.
SQL Server에서 11 ~ 20 행을 선택하도록 오프셋으로 제한 :
SELECT email FROM emailTable
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
OFFSET
: 건너 뛴 행 수NEXT
: 필요한 다음 행 수SQL_CALC_FOUND_ROWS
이를 사용하는 경우는?
select top {LIMIT HERE} * from (
select *, ROW_NUMBER() over (order by {ORDER FIELD}) as r_n_n
from {YOUR TABLES} where {OTHER OPTIONAL FILTERS}
) xx where r_n_n >={OFFSET HERE}
참고 :
이 솔루션 ROW_NUMBER()
은 구현 되었을 때부터 SQL Server 2005 이상에서만 작동 합니다.
AS xx
나를 위해 OFFSET과 FETCH를 함께 사용하는 것이 느렸으므로 TOP과 OFFSET의 조합을 다음과 같이 사용했습니다 (더 빠름).
SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
참고 : TOP과 OFFSET을 같은 쿼리에서 함께 사용하는 경우 :
SELECT TOP 20 columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS
그런 다음 오류가 발생하므로 TOP과 OFFSET을 함께 사용하려면 하위 쿼리로 구분해야합니다.
SELECT DISTINCT를 사용해야하는 경우 쿼리는 다음과 같습니다.
SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
참고 : DISTINCT와 함께 SELECT ROW_NUMBER를 사용하면 효과가 없었습니다.
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
변환해야합니다 SELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. 답변을 편집하겠습니다. 고마워 영어 실례합니다
다른 샘플 :
declare @limit int
declare @offset int
set @offset = 2;
set @limit = 20;
declare @count int
declare @idxini int
declare @idxfim int
select @idxfim = @offset * @limit
select @idxini = @idxfim - (@limit-1);
WITH paging AS
(
SELECT
ROW_NUMBER() OVER (order by object_id) AS rowid, *
FROM
sys.objects
)
select *
from
(select COUNT(1) as rowqtd from paging) qtd,
paging
where
rowid between @idxini and @idxfim
order by
rowid;
Aaronaught의 솔루션에 약간의 변형을 추가하여 일반적으로 페이지 번호 (@PageNum)와 페이지 크기 (@PageSize)를 매개 변수화합니다. 이 방법으로 각 페이지 클릭 이벤트는 구성 가능한 페이지 크기와 함께 요청 된 페이지 번호를 전송합니다.
begin
with My_CTE as
(
SELECT col1,
ROW_NUMBER() OVER(ORDER BY col1) AS row_number
FROM
My_Table
WHERE
<<<whatever>>>
)
select * from My_CTE
WHERE RowNum BETWEEN (@PageNum - 1) * (@PageSize + 1)
AND @PageNum * @PageSize
end
내가 할 수있는 가장 가까운 것은
select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber and ct <= toNumber
내가 생각하는 것과 비슷한 select * from [db].[dbo].[table] LIMIT 0, 10
@nombre_row :nombre ligne par page
@page:numero de la page
//--------------code sql---------------
declare @page int,@nombre_row int;
set @page='2';
set @nombre_row=5;
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY etudiant_ID ) AS RowNum, *
FROM etudiant
) AS RowConstrainedResult
WHERE RowNum >= ((@page-1)*@nombre_row)+1
AND RowNum < ((@page)*@nombre_row)+1
ORDER BY RowNum
아무도이 코드를 아직 제공하지 않았으므로 :
SELECT TOP @limit f1, f2, f3...
FROM t1
WHERE c1 = v1, c2 > v2...
AND
t1.id NOT IN
(SELECT TOP @offset id
FROM t1
WHERE c1 = v1, c2 > v2...
ORDER BY o1, o2...)
ORDER BY o1, o2...
중요한 점 :
@limit
검색 할 결과 수로 대체 할 수 있습니다.@offset
건너 뛸 결과 수where
및 order by
절이며 동기화되지 않은 경우 잘못된 결과를 제공합니다order by
에 그것이 필요한 경우 명시 적으로 있습니다특히 SQL-SERVER의 경우 여러 가지 방법으로이를 달성 할 수 있습니다. 실제 예제에서는 고객 테이블을 사용했습니다.
예 1 : "SET ROWCOUNT"사용
SET ROWCOUNT 10
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
모든 행을 리턴하려면 ROWCOUNT를 0으로 설정하십시오.
SET ROWCOUNT 0
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
예 2 : "ROW_NUMBER 및 OVER"사용
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber Between 0 and 10
예 3 : "OFFSET and FETCH"를 사용하지만이 "ORDER BY"는 필수
SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
이것이 도움이되기를 바랍니다.
이 스크립트는 페이지 당 100 만 개의 레코드로 100 만 레코드를 더 유용하게 테스트하기 때문에 PC에서이 스크립트를 0 초 더 빠르게 실행하는 반면 mysql과 비교할 때 4.5 초의 오프셋과 4.5 초의 오프셋으로 결과를 얻을 수 있습니다.
Row_Number ()가 항상 특정 필드를 기준으로 정렬한다는 것을 이해하지 못할 수 있습니다. 순서대로 행만 정의 해야하는 경우 다음을 사용해야합니다.
SELECT TOP {LIMIT} * FROM (
SELECT TOP {LIMIT} + {OFFSET} ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ROW_NO,*
FROM {TABLE_NAME}
) XX WHERE ROW_NO > {OFFSET}
설명: