sql server management studio




Microsoft SQL Server 2000에서 MySQL LIMIT 절을 에뮬레이트하십시오. (3)

LIMIT 만 필요할 때 ms sql에는 TOP 키워드가 있으므로 분명합니다. LIMIT에 OFFSET이 필요할 때 이전에 설명한 것과 같은 해킹을 시도 할 수 있지만 모든 방법이 오버 헤드를 추가합니다. 즉, 한 가지 방법으로 주문한 다음 다른 방식으로 주문하거나 expencive NOT IN 작업을합니다. 모든 계곡이 필요 없다고 생각합니다. 내 의견에서 가장 깨끗한 솔루션은 SQL 측에서 오프셋없이 TOP을 사용하고 php의 mssql_data_seek와 같은 적절한 클라이언트 메소드를 사용하여 필요한 시작 레코드를 찾는 것입니다. 이것은 순수한 SQL 솔루션은 아니지만 오버 헤드를 추가하지 않기 때문에 가장 좋은 솔루션이라고 생각합니다. 건너 뛴 레코드는 네트워크를 통해 전달할 수 없습니다. ).

젠드 프레임 워크의 데이터베이스 컴포넌트를 작업 할 때 MySQL, PostgreSQL 및 SQLite가 지원하는 LIMIT 절의 기능을 추상화하려고했습니다. 즉, 쿼리를 만드는 것이 이렇게 할 수 있습니다.

$select = $db->select();
$select->from('mytable');
$select->order('somecolumn');
$select->limit(10, 20);

데이터베이스가 LIMIT 지원하면 다음과 같은 SQL 쿼리가 생성됩니다.

SELECT * FROM mytable ORDER BY somecolumn LIMIT 10, 20

이것은 LIMIT 지원하지 않는 데이터베이스 브랜드 (이 절은 표준 SQL 언어의 일부는 아님)에서 더 복잡했습니다. 행 번호를 생성 할 수 있으면 전체 쿼리를 파생 테이블로 만들고 외부 쿼리에서 BETWEEN 사용합니다. 이것이 Oracle과 IBM DB2의 솔루션이었습니다. Microsoft SQL Server 2005는 비슷한 행 번호 기능을 가지고 있으므로이 방법으로 쿼리를 작성할 수 있습니다.

SELECT z2.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS zend_db_rownum, z1.*
    FROM ( ...original SQL query... ) z1
) z2
WHERE z2.zend_db_rownum BETWEEN @offset+1 AND @[email protected];

그러나 Microsoft SQL Server 2000에는 ROW_NUMBER() 함수가 없습니다.

그래서 내 질문은, 당신은 SQL을 사용하여 Microsoft SQL Server 2000에서 LIMIT 기능을 에뮬레이션하는 방법을 생각해 낼 수 있습니까? 커서 또는 T-SQL 또는 저장 프로 시저를 사용하지 않고. 카운트와 오프셋 모두 LIMIT 에 대한 두 인수를 모두 지원해야합니다. 임시 테이블을 사용하는 솔루션도 허용되지 않습니다.

편집하다:

MS SQL Server 2000에 대한 가장 일반적인 솔루션은 다음과 같습니다. 예를 들어 50에서 75까지의 행을 얻으려면 다음과 같습니다.

SELECT TOP 25 *
FROM ( 
  SELECT TOP 75 *
  FROM   table 
  ORDER BY BY field ASC
) a 
ORDER BY field DESC;

그러나 총 결과 집합이 말하면 60 행인 경우에는 작동하지 않습니다. 내부 질의는 60 행을 반환합니다. 그 이유는 이것이 외부 75 행에 있기 때문입니다. 그런 다음 외부 질의는 35-60 행을 반환합니다. 이는 원하는 "페이지"50-75에 맞지 않습니다. 기본적으로이 솔루션은 페이지 크기의 배수가 아닌 결과 집합의 마지막 "페이지"가 ​​필요하지 않는 한 작동합니다.

편집하다:

다른 솔루션이 더 효과적이지만 결과 세트에 고유 한 열이 있다고 가정 할 수있는 경우에만 가능합니다.

SELECT TOP n *
FROM tablename
WHERE key NOT IN (
    SELECT TOP x key
    FROM tablename
    ORDER BY key
);

결론:

MS SQL Server 2000에서 LIMIT 를 에뮬레이션하는 데 범용 솔루션이없는 것 같습니다. MS SQL Server 2005에서 ROW_NUMBER() 함수를 사용할 수 있다면 좋은 해결책이 존재합니다.


except 문을 사용하기 때문에 Sql Server 2005 이상에서만 작동하는 또 다른 솔루션입니다. 그러나 나는 그것을 어떻게해서든지 공유한다. 50-75 기록을 얻기 원한다면 :

select * from (
    SELECT top 75 COL1, COL2
    FROM MYTABLE order by COL3
) as foo
except
select * from (
    SELECT top 50 COL1, COL2
    FROM MYTABLE order by COL3
) as bar

SELECT TOP n *
FROM tablename
WHERE key NOT IN (
    SELECT TOP x key
    FROM tablename
    ORDER BY key
    DESC
);




zend-framework