2016-05-30 62 views
1

我有兩個表,一個包含國界,一個包含一個功能(例如電纜),我想知道它們位於哪個國家。無法合併條件與SDO_CONTAINS/SDO_RELATE

於是我就用下面的查詢:

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') 

任何人都可以解釋爲什麼我看到這種奇怪的行爲,我如何能夠最好地解決呢?使用物化視圖充其量只會讓人感到ha ha。

+0

您的第一個查詢的結果是否包含'NL'作爲國家代碼的任何行? – micklesh

+0

我的第一個查詢返回723行'NL'作爲國家代碼。也許它不夠清楚,但如果我首先將查詢轉換爲物化視圖,它就能正常工作(並且只能工作)。我會假設子查詢或額外的條件會類似地工作,我有點困惑它不。 – nathanvda

回答

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,因爲國家有內...在電纜您的查詢是否爲