문제

MySQL과 함께이 쿼리가 있습니다.

select * from table1 LIMIT 10,20

Microsoft SQL로 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

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의 한계 조항의 누락은 범죄, IMO입니다. 이런 종류의 kludgy 해결 방법을 할 필요는 없습니다.

SQL Server 2012부터 시작하면 오프셋 페치 절을 사용할 수 있습니다.

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

주문이 고유하지 않은 경우 올바르게 작동하지 않을 수 있습니다.

쿼리가 OrderDate에 의해 주문하도록 수정되면 반환 된 결과 세트는 예상대로 아닙니다.

이것은 10 월에 질문 한 질문의 거의 복제입니다.Microsoft SQL Server 2000에서 MySQL 한계 절을 모방합니다

Microsoft SQL Server 2000을 사용하는 경우 좋은 솔루션이 없습니다. 대부분의 사람들은 임시 테이블에서 쿼리 결과를 IDENTITY 기본 키. 그런 다음 a를 사용하여 기본 키 열에 대한 쿼리 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;

당신은 이것을 a로 쓸 수도 있습니다 일반적인 테이블 표현 @Leon Tayson 's에서 볼 수 있듯이 대답.

SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10

이것이 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). 즉, 위의 코드는 표 1의 레코드를 10 행에서 시작하고 20에서 끝나는 레코드를 가져옵니다. 따라서 행 10-20을 당기는 것입니다.

자세한 내용은 링크를 확인하십시오 오프셋

구문 적으로 MySQL 한계 쿼리는 다음과 같습니다.

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

필드가 추가되거나 제거되면 "행"이 자동으로 업데이트됩니다.

이 옵션의 주요 문제는 주문의 주문이 수정된다는 것입니다. 따라서 다른 순서를 원한다면 다른보기를 만들어야합니다.

업데이트

이 접근법에는 또 다른 문제가 있습니다. 데이터를 필터링하려고하면 예상대로 작동하지 않습니다. 예를 들어, 그렇다면 :

SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20

여기서 전체 데이터 세트를 검색하고 출력을 제한하는 대신 10에서 20 사이의 데이터로 제한됩니다.

이것은 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;

SQL에는 한계 키워드가 없습니다. 제한된 수의 행만 필요한 경우 한도와 유사한 상단 키워드를 사용해야합니다.

꼭 해봐. 아래 쿼리에서 그룹을 볼 수 있습니다.

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

ID가 고유 식별자 유형이거나 테이블에있는 ID가 정렬되지 않은 경우 아래에서와 같이해야합니다.

select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5



코드가 될 것입니다

select * from limit 2,5

내가 올바르게 기억한다면 (SQL Server와 함께 멍청한 지 오래되었습니다) : 다음과 같은 것을 사용할 수 있습니다 : (2005 이상)

SELECT
    *
   ,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
SELECT TOP 10 * FROM table;

와 같다

SELECT * FROM table LIMIT 0,10;

다음은 MSSQL에서 한도 구현에 관한 기사입니다 그것은 좋은 읽기, 특히 댓글입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top