MySQL 에서이 쿼리가 있습니다.
select * from table1 LIMIT 10,20
SQL Server에서이 작업을 어떻게 수행 할 수 있습니까?
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 에 대한 자세한 정보는 링크를 확인하십시오.
문법적으로 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
이것이 내가 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 사이의 행에있는 데이터로 제한됩니다.
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;
SELECT TOP 10 * FROM table;
와 같다
SELECT * FROM table LIMIT 0,10;
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
WHERE
동일한 레벨 SELECT
절에 정의 된 별칭을 참조 할 수 없습니다 .