【问题标题】:In Oracle, why can´t I select rownum in a outer query, when my inner query contains SDO_ANYINTERACT?在 Oracle 中,当我的内部查询包含 SDO_ANYINTERACT 时,为什么我不能在外部查询中选择 rownum?
【发布时间】:2011-01-05 12:34:23
【问题描述】:

我在 Oracle 中编写了如下查询:

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

【问题讨论】:

  • 您能否给我们 MY_TABLE 的 CREATE TABLE 语句和一些插入,以便其他人可以重现?

标签: oracle spatial row-number


【解决方案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 文章。

【讨论】:

  • 它似乎工作了!但为什么??当我不使用 SDO_ANYINTERACT 时,我的查询运行良好。看起来真的很奇怪。
  • 看看我在解决方案中提到的文章。它很好地解释了这里发生的事情。
  • Vadim,我在文章中也看不到任何解释这一点的内容 - 你能详细说明一下吗?
  • 从各方面来看,Jesper 的原始代码应该可以工作。经过一番调查,似乎(至少在我的系统上)引入rownum 的子查询导致Oracle 抛出内部异常ORA-00600,Oracle 建议的补救措施是将其作为错误报告给他们。
  • 在工作中,我的开发服务器(带有补丁的 10gR2)执行 Jesper 的查询没有问题。可能是某个 Oracle 补丁集解决了这个问题。
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多