No Oracle, por que não posso selecionar rownum em uma consulta externa, quando minha consulta interna contém sdo_anyinteract?
-
20-09-2019 - |
Pergunta
Eu escrevi uma consulta no Oracle que se parece com o seguinte:
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
A consulta interna está selecionando linhas de my_table usando uma caixa delimitadora. As consultas externas são incluídas para ativar a paginação para os resultados.
Por algum motivo estranho, essa consulta não produz nenhum resultado. Se eu tentar executar a subconsência:
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
Ele produz uma lista de resultados conforme o esperado. Se eu executar a subconsulta:
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
O conjunto de resultados está vazio. De alguma forma, Rownum está impedindo que a consulta produza quaisquer resultados. Se eu remover o ROOWNUM, os resultados serão retornados como no mais interno Query:
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
O que eu estou fazendo errado aqui?? Estou executando o Oracle 10g ..
Solução
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
Ver isto artigo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow