Oracle에서 내부 쿼리가 sdo_anyinteract가 포함되어있을 때 외부 쿼리에서 rownum을 선택할 수없는 이유는 무엇입니까?
-
20-09-2019 - |
문제
오라클에서 다음과 같은 쿼리를 썼습니다.
select ID, NAME, GEOMETRY from
(
select a.*, rownum as rnm from
(
select ID, NAME, GEOMETRY from MY_TABLE
where SDO_ANYINTERACT(GEOMETRY, SDO_UTIL.SDO_GEOMETRY('POLYGON ((670000 6268000, 670000 6269000, 700000 6269000, 700000 6268000, 670000 6268000))')) = 'TRUE'
order by NAME asc
) a
)
where rnm <= 50 and rnm >= 40
내부 쿼리는 경계 상자를 사용하여 my_table에서 행을 선택합니다. 결과에 대한 페이징을 활성화하기 위해 외부 쿼리가 포함되어 있습니다.
이상한 이유로이 쿼리는 결과를 얻지 못합니다. 하위 쿼리를 시도하고 실행하면 :
select ID, NAME, GEOMETRY from MY_TABLE
where SDO_ANYINTERACT(GEOMETRY, SDO_UTIL.SDO_GEOMETRY('POLYGON ((670000 6268000, 670000 6269000, 700000 6269000, 700000 6268000, 670000 6268000))')) = 'TRUE'
order by NAME asc
예상대로 결과 목록을 생성합니다. 하위 쿼리를 실행하면 :
select a.*, rownum as rnm from
(
select ID, NAME, GEOMETRY from MY_TABLE
where SDO_ANYINTERACT(GEOMETRY, SDO_UTIL.SDO_GEOMETRY('POLYGON ((670000 6268000, 670000 6269000, 700000 6269000, 700000 6268000, 670000 6268000))')) = 'TRUE'
order by NAME asc
) a
결과 세트가 비어 있습니다. 어떻게 든 Rownum은 쿼리가 결과를 얻지 못하게합니다. Rownum을 제거하면 가장 안쪽 쿼리에서 결과가 반환됩니다.
select a.* from
(
select ID, NAME, GEOMETRY from MY_TABLE
where SDO_ANYINTERACT(GEOMETRY, SDO_UTIL.SDO_GEOMETRY('POLYGON ((670000 6268000, 670000 6269000, 700000 6269000, 700000 6268000, 670000 6268000))')) = 'TRUE'
order by NAME asc
) a
내가 여기서 뭘 잘못하고 있니 ?? 나는 Oracle 10G를 실행하고있다 ..
해결책
with
my_query as
(
select ID, NAME, GEOMETRY from MY_TABLE
where SDO_ANYINTERACT(GEOMETRY, SDO_UTIL.SDO_GEOMETRY('POLYGON ((670000 6268000, 670000 6269000, 700000 6269000, 700000 6268000, 670000 6268000))')) = 'TRUE'
order by NAME asc
)
select *
from
(
select /*+ FIRST_ROWS(n) */ my_query.*, rownum rnum
from my_query
where rownum <= :last_row_to_fetch
)
where
rnum >= :first_row_to_fetch
보다 이것 기사.
제휴하지 않습니다 StackOverflow