2010-01-15 4 views
3

Я написал запрос в Oracle который выглядит следующим образом:В Oracle, почему я не могу выбрать rownum во внешнем запросе, когда мой внутренний запрос содержит SDO_ANYINTERACT?

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 ..

+0

Не могли бы вы дать нам инструкцию CREATE TABLE MY_TABLE и пару вставок, чтобы другие могли воспроизводить? –

ответ

1
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 

См this статью.

+0

Кажется, что это работает! Но почему?? Мой запрос работает нормально, когда я не использую SDO_ANYINTERACT. Кажется, это действительно странно. –

+0

Посмотрите на статью, которую я упоминаю в решении. Он предлагает отличное объяснение того, что здесь происходит. –

+0

Вадим, я ничего не вижу в этой статье, которая объясняет это - вы можете уточнить? –