대부분의 데이터베이스는 ORDER BY
하위 쿼리에서 다음 중 하나 라는 사실에 대해 매우 분명 합니다.
- 허용되지 않음 : 예 : SQL Server, Sybase SQL Anywhere (
TOP
또는로 보완되지 않는 한 OFFSET .. FETCH
)
- 의미 없음 : 예 : PostgreSQL, DB2 (
OFFSET .. FETCH
또는로 보완하지 않는 한 LIMIT
)
다음은 DB2 LUW 매뉴얼 (강조 광산)의 예입니다.
부속 선택의 ORDER BY 절 은 조회가 리턴 한 행 순서에 영향을 미치지 않습니다 . ORDER BY 절은 가장 바깥 쪽 fullselect에 지정된 경우 리턴 된 행의 순서에만 영향을줍니다.
PostgreSQL과 마찬가지로 표현은 매우 명시 적입니다 .
정렬을 선택하지 않으면 행이 지정되지 않은 순서로 반환됩니다. 이 경우 실제 순서는 스캔 및 결합 계획 유형 및 디스크 순서에 따라 달라 지지만 의지하지 않아야합니다 . 정렬 단계가 명시 적으로 선택된 경우에만 특정 출력 순서를 보장 할 수 있습니다.
이 사양 ORDER BY
에서 파생 테이블 의 절에서 생성 된 순서 는 우연히 발생하는 것으로 예상되는 순서 (사소한 예에서는 대부분의 데이터베이스에서 발생하는 순서)와 일치 할 수 있지만이 방법을 사용하는 것은 현명하지 않습니다. 이.
DB2에 대한 참고 사항 :
특히, DB2에는 알려진 기능이 적ORDER BY ORDER OF <table-designator>
으며 다음과 같이 사용할 수 있습니다.
SELECT C1 FROM
(SELECT C1 FROM T1
UNION
SELECT C1 FROM T2
ORDER BY C1 ) AS UTABLE
ORDER BY ORDER OF UTABLE
이 경우 파생 테이블의 순서는 가장 바깥 쪽 SELECT에서 명시 적으로 재사용 할 수 있습니다.
오라클에 대한 참고 사항 :
수년 동안 오라클은을 OFFSET
사용하여 페이지 매김 을 구현하는 관행 이었으며 파생 테이블 을 주문한 후에ROWNUM
만 합리적으로 계산할 수 있습니다 .
SELECT *
FROM (
SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
FROM (
SELECT * FROM table ORDER BY time DESC
) t
) t
WHERE rn BETWEEN 10 AND 20
적어도 ROWNUM
쿼리에 존재 한다면, 미래의 Oracle 버전은 기존의 모든 Oracle SQL을 거의 파괴하지 않기 위해이 동작을 중단하지 않을 것으로 예상 할 수 있습니다. 읽을 수있는 SQL 표준 OFFSET .. FETCH
구문 :
SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY