في Oracle ، لماذا لا يمكنني تحديد Rownum في استعلام خارجي ، عندما يحتوي استعلام داخلي على SDO_AnyInteract؟

StackOverflow https://stackoverflow.com/questions/2071854

  •  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

يرى هذه مقالة - سلعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top