我有两个表,一个包含国家边界,另一个包含一个特征(例如电缆),我想知道它们位于哪个国家。
因此,我使用以下查询:
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-子句、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')谁能解释一下为什么我会看到这种奇怪的行为,以及我如何才能最好地解决这个问题?使用物化视图给人的感觉充其量是一种黑客的感觉。
发布于 2018-03-07 02:22:39
您必须使用/*+ 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,因为country内部有电缆...在您的查询中是不同的
https://stackoverflow.com/questions/37525349
复制相似问题