无法将条件与SDO_CONTAINS / SDO_RELATE

时间:2016-05-30 12:11:16

标签: oracle oracle-spatial

我有两个表,一个包含国家边界,另一个包含一个功能(例如电缆),我想知道它们所在的国家/地区。

所以我使用以下查询:

select cc.country_code, ca.*
from CABLES ca, COUNTRIES cc
where sdo_contains(cc.geometry, ca.geometry) = 'TRUE'

这样做:我得到一个明确的清单,每条电缆都有一个国家代码。

现在我想选择位于荷兰的所有电缆,所以我写了类似的东西:

select cc.country_code, ca.*
from CABLES ca, COUNTRIES cc
where sdo_contains(cc.geometry, ca.geometry) = 'TRUE'
  and cc.country_code = 'NL' 

我突然得到no rows selected

我尝试了各种替代方法:使用子查询,带子句,sdo_relate,它们都具有相同的效果:未选择任何行。我尝试使用视图,但我想这与在内部编写子查询具有相同的效果。

使用SDO_ANYINTERACT时,我可以添加条件country_code = 'NL'并获得一些结果,但它不会给我相同的结果(很明显?)。

定义视图的奇怪之处如下:

create or replace view cables_with_country as 
  select cc.country_code, ca.*
  from cables ca, countries cc
  where (sdo_contains(cc.geometry, ca.geometry) = 'TRUE')

然后执行select count(*) from cables_with_country返回0 ???

到目前为止,唯一有效的解决方案是使用物化视图:

create materialized view cables_with_country_mv as 
  select cc.country_code, ca.*
  from cables ca, countries cc
  where (sdo_contains(cc.geometry, ca.geometry) = 'TRUE')

任何人都可以解释为什么我会看到这种奇怪的行为以及我如何才能最好地解决这个问题?使用物化视图充其量只会感到虚伪。

1 个答案:

答案 0 :(得分:0)

您必须使用/*+ ordered */提示

在你的情况下,SQL应该是这样的:

select /*+ ORDERED */ 
cc.country_code, ca.all
from  COUNTRIES cc,CABLES ca -- in this order
where sdo_contains(ca.geometry,cc.geometry) = 'TRUE'
  and cc.country_code = 'NL';

请注意,我更改了sdo_contains,因为国家/地区内部有电缆...在您的查询中没有其他