2014-10-20 195 views
0
更新表關閉ST_INTERSECT查詢

所以基本上我在Netezza公司兩個簡單的線數據集,我想創建一個表,僅包括了從數據集1號線不相交從任何數據集線2無法在Netezza公司

ST_DISJOINT似乎不起作用,它返回了成千上萬的重複值,我認爲這是因爲Netezza按行運行查詢並每次返回一條記錄,兩條特定的線不會相交?

所以我想我會簡單地標記數據集1中的每一行,然後使用UPDATE DATSET 1 WHERE ST_INTERSECTS(dataset1,dataset2)選擇那些沒有標誌的行。

但是,這會返回多對一的關係錯誤。有沒有一種方法可以讓它只檢查第一個相交或某種方式來阻止它嘗試將多個值分配給單個記錄?

我覺得我的問題可能有一個更簡單的解決方案(選擇集合1中的所有行都不會與集合2中的任何行相交),任何幫助將不勝感激。

乾杯!

回答

0

當比較每個包含幾何的列時,ST_DISJOINT將返回布爾值true或false。我不知道我是如何根據問題的措辭理解數據的存儲方式,但是如果您的表格被稱爲dataset1和dataset2,每個表格的幾何存儲在名爲geoms的列中,則可以使用以下方法。

insert into dataset1 values (inza..ST_WKTTOSQL('LineString(0 0, 3 0)')); 
insert into dataset1 values (inza..ST_WKTTOSQL('LineString(0 1, 3 1)')); 
insert into dataset1 values (inza..ST_WKTTOSQL('LineString(2 2, 3 2)')); 

insert into dataset2 values (inza..ST_WKTTOSQL('LineString(0 0, 0 3)')); 
insert into dataset2 values (inza..ST_WKTTOSQL('LineString(1 2, 1 3)')); 
insert into dataset2 values (inza..ST_WKTTOSQL('LineString(-1 0, -1 4)')); 

select count(1) from dataset1 a 
where not exists (
select 1 from dataset2 b where inza..ST_DISJOINT(a.geoms,b.geoms)=FALSE 
); 

COUNT 
------- 
    1 
(1 row) 

select count(1) from dataset2 a 
where not exists (
select 1 from dataset1 b where inza..ST_DISJOINT(a.geoms,b.geoms)=FALSE 
); 

COUNT 
------- 
    2 
(1 row)