Zend Framework's database component에서 작업했을 때 MySQL, PostgreSQL 및 SQLite에서 지원하는 LIMIT
절의 기능을 추상화하려고 시도했습니다.Microsoft SQL Server 2000의 MySQL 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의 솔루션이었습니다.
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];
그러나, 마이크로 소프트 SQL 서버 2000
ROW_NUMBER()
기능이없는 하나는 쿼리이 방법을 쓸 수 있도록 마이크로 소프트 SQL 서버 2005, 유사한 행 번호 기능을 가지고 있습니다.
제 질문은 SQL을 사용하여 Microsoft SQL Server 2000의 LIMIT
기능을 에뮬레이트하는 방법을 생각해 낼 수 있습니까? 커서 또는 T-SQL 또는 저장 프로 시저를 사용하지 않고. 카운트와 오프셋 모두 LIMIT
에 대한 두 인수를 모두 지원해야합니다. 임시 테이블을 사용하는 솔루션도 허용되지 않습니다.
편집 : MS SQL Server 2000의 가장 일반적인 솔루션은 예 (75)를 통해 행 (50)를 얻을 수 있도록, 아래와 같은 것 같다
:
SELECT TOP 25 *
FROM (
SELECT TOP 75 *
FROM table
ORDER BY BY field ASC
) a
ORDER BY field DESC;
을하지만,이 '아무튼 총 결과 세트가 예를 들어 60 행이면 t 작업. 내부 질의는 60 행을 반환합니다. 그 이유는 이것이 외부 75 행에 있기 때문입니다. 그런 다음 외부 질의는 35-60 행을 반환합니다. 이는 원하는 "페이지"50-75에 맞지 않습니다. 기본적으로이 솔루션은 페이지 크기의 배수가 아닌 결과 집합의 마지막 "페이지"가 필요하지 않는 한 작동합니다.
편집 :
또 다른 해결책은 잘 작동하지만 결과 집합을 가정 할 수있는 경우에만 고유 한 열을 포함
SELECT TOP n *
FROM tablename
WHERE key NOT IN (
SELECT TOP x key
FROM tablename
ORDER BY key
);
결론 :
없음 일반 -purpose 솔루션은 MS SQL Server 2000에서 LIMIT
을 에뮬레이트하는 것으로 나타납니다. ROW_NUMBER()
펑션을 사용할 수 있으면 좋은 해결책이 있습니다 MS SQL Server 2005의 경우.
예,이 가까이이지만, 중간 쿼리 결과에 고유 키가있을 때만 작동합니다. GROUP BY 쿼리에서 또는 여러 테이블을 조인하는 쿼리를 어떻게 수행합니까? –