programing

SQL Server에서 LIMIT를 구현하는 방법

closeapi 2023. 4. 11. 22:01
반응형

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

반응형