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
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 오더가 고유하지 않은 경우 올바르게 동작하지 않을 수 있습니다.
쿼리를 ORDER BY OrderDate로 변경하면 반환되는 결과 세트가 예상과 다릅니다.
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행에서 꺼내기 시작하면 10개의 다음 세트를 잡습니다(yy
즉, 위의 코드는 10행부터 20행까지 테이블1에서 레코드를 꺼냅니다.그래서 10~20행을 당깁니다.
OFFSET에 대한 자세한 내용은 링크를 참조하십시오.
이것은 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의 답변에 나타난 것과 같이 일반적인 표식으로 쓸 수도 있습니다.
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
SELECT TOP 10 * FROM table;
와 동일하다
SELECT * FROM table LIMIT 0,10;
여기 MsSQL에서의 제한 구현에 대한 기사가 있습니다. 좋은 읽을거리입니다. 특히 코멘트입니다.
이것이 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
WHERE는 (전체 데이터 세트를 검색하고 출력을 제한하는 대신) 10에서 20 사이의 행에 있는 데이터로 제한됩니다.
SQL에는 LIMIT 키워드가 없습니다.행의 수가 한정되어 있는 경우는, LIMIT 와 같은 TOP 키워드를 사용할 필요가 있습니다.
시도해야 한다.아래 조회에서는 그룹화 기준, 정렬 기준, 행 건너뛰기 및 행 제한을 볼 수 있습니다.
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
쉬운 방법
MYSQL:
SELECT 'filds' FROM 'table' WHERE 'where' LIMIT 'offset','per_page'
MSQL:
SELECT 'filds' FROM 'table' WHERE 'where' ORDER BY 'any' OFFSET 'offset'
ROWS FETCH NEXT 'per_page' ROWS ONLY
ORDER BY는 필수입니다.
이는 SQL2000에서 동작하는 다단계 접근법입니다.
-- 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
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;
ID가 고유 식별자 유형이거나 테이블에서 ID가 정렬되지 않은 경우 다음과 같이 수행해야 합니다.
select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5
암호는 다음과 같습니다.
제한 2,5에서 *를 선택합니다.
MSSQLExpress 2017에서 사용하는 것이 좋습니다.
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;
--열 [카운트]를 지정하고, 순서 없이 각 행에 일의의 카운트를 할당한 후, 제한을 지정할 수 있는 장소를 다시 선택합니다.:)
다음과 같은 결과를 얻을 수 있는 가능한 방법 중 하나는 이것이 도움이 되기를 바랍니다.
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
제 기억이 맞다면 (SQL Server에 손을 댄 지 꽤 오래되었습니다) 다음과 같은 것을 사용할 수 있을 것입니다. (2005년 이후)
SELECT
*
,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
언급URL : https://stackoverflow.com/questions/603724/how-to-implement-limit-with-sql-server
'programing' 카테고리의 다른 글
특정 파일만 해동하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
---|---|
Excel 2007 VBA에서 Excel 워크시트의 맨 위 행을 프로그램 방식으로 고정하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
Spring Boot 어플리케이션용 JUnit @BeforeClass 비정적 대응 (0) | 2023.04.06 |
[ Typescript ]에서 유형과 인터페이스의 차이점은 무엇입니까? (0) | 2023.04.06 |
마음에 드는 SQL*Plus 힌트 및 요령 (0) | 2023.04.06 |