Microsoft SQL Server 2000의 MySQL LIMIT 절 에뮬레이트
젠드 프레임워크의 데이터베이스 구성 요소를 작업할 때, 우리는 그 기능을 추상화하려고 했습니다.LIMIT
에서 하는 절SQL, Postgre에서 지원하는 SQL 및 SQL, SQLite.즉과로를할수다은다수할즉y:t,eadsey은를sg과,으로
$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 언어의 일부가 아닙니다.)번호를 할 수 테이블로 외부 행를수는우체를생로서고부할서부f고로생행를체ese,를우uw,eenandeBETWEEN
이었습니다. 이것이 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 @offset+@count;
"SQL 에는 2000"이 없습니다.ROW_NUMBER()
기능.
그래서 제 질문은, 당신이 우리가 그들을 본받을 수 있는 방법을 생각해 낼 수 있느냐는 것입니다.LIMIT
SQL만을 사용하는 Microsoft SQL Server 2000의 기능성을 확인할 수 있습니까?커서나 T-SQL 또는 저장 프로시저를 사용하지 않습니다.을두야다두rh야t은ot두s지두을rshLIMIT
, 와 와 임시 테이블을 사용하는 솔루션도 허용되지 않습니다.
편집:
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행인 경우에는 작동하지 않습니다.내부 쿼리는 상위 75개에 있으므로 60개 행을 반환합니다.그러면 외부 쿼리는 35-60 행을 반환하며, 이 행은 50-75의 원하는 "페이지"에 맞지 않습니다.기본적으로 이 솔루션은 페이지 크기의 배수가 아닌 결과 집합의 마지막 "페이지"가 필요하지 않은 경우에만 작동합니다.
편집:
다른 솔루션이 더 효과적이지만, 결과 집합에 고유한 열이 포함되어 있다고 가정할 수 있는 경우에만 다음과 같은 솔루션이 적용됩니다.
SELECT TOP n *
FROM tablename
WHERE key NOT IN (
SELECT TOP x key
FROM tablename
ORDER BY key
);
결론:
Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ,LIMIT
MS SQL Server 2000 업데이트.만약 당신이 사용할 수 있다면 좋은 해결책이 존재합니다.ROW_NUMBER()
MS SQL Server 2005 기능합니다.
다음은 예외 문을 사용하기 때문에 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
);
LIMIT만 필요한 경우 msql에 해당하는 TOP 키워드가 있으므로 명확합니다.OFFFSET을 사용하여 LIMIT가 필요할 때는 앞서 설명한 것과 같이 몇 가지 해킹을 시도할 수 있지만, 모두 일방적으로 주문한 후 다른 방식으로 주문하거나 운영 중이 아닌 고가의 작업을 위해 오버헤드를 추가합니다.저는 그 모든 계단식이 필요하지 않다고 생각합니다.제가 생각하는 가장 깨끗한 솔루션은 SQL 쪽에서 오프셋 없이 TOP만 사용하고 pph의 mssql_data_seek와 같이 적절한 클라이언트 방법으로 필요한 시작 레코드를 찾는 것입니다.이 솔루션은 순수 SQL 솔루션은 아니지만 오버헤드가 추가되지 않기 때문에 가장 적합한 솔루션이라고 생각합니다. 오버헤드가 발생하지 않기 때문입니다(과거 기록을 검색할 때 건너뛸 레코드는 네트워크에서 전송되지 않습니다.).
나는 그것이 그곳에서 꽤 간단하기 때문에 이것을 나의 ORM에 구현하려고 노력할 것입니다.정말 SQL Server에 있어야 한다면 다음의 linq to sq 문에 대해 linq to sql에서 생성된 코드를 보고 거기서부터 진행하겠습니다.이 코드를 구현한 MSFT 엔지니어는 수년간 SQL 팀의 일원이었으며 자신이 무엇을 하고 있는지 알고 있었습니다.
var result = myDataContext.mytable.건너뛰기(pageIndex * pageSize).가져가기(pageSize)
언급URL : https://stackoverflow.com/questions/216673/emulate-mysql-limit-clause-in-microsoft-sql-server-2000
'programing' 카테고리의 다른 글
jquery detection 특정 클래스의 div가 DOM에 추가되었습니다. (0) | 2023.09.06 |
---|---|
python에서 클래스의 모든 멤버 변수를 루핑 (0) | 2023.09.06 |
PSCustomObject가 아닌 원시 형식(예: String)을 반환하도록 Select-Object를 가져오는 방법은 무엇입니까? (0) | 2023.09.06 |
mysql에서 캐스케이드를 삭제할 때 어떻게 사용합니까? (0) | 2023.09.06 |
오류: SQLSTATE[HY000] [2002] 대상 머신이 적극적으로 거부하여 연결할 수 없음 (0) | 2023.09.06 |