2014-10-20 150 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)