无法将条件与SDO_CONTAINS / SDO_RELATE组合

问题描述 投票:1回答:1

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

所以我使用以下查询:

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

我尝试了各种替代方法:使用子查询,with-clause,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')

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

oracle oracle-spatial
1个回答
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,因为国家/地区内部有电缆...在您的查询中是另外的

© www.soinside.com 2019 - 2024. All rights reserved.