所以基本上我在Netezza中有两个简单的线数据集,我想创建一个表,它只包含数据集1中不与数据集2的任何行相交的行。
ST_DISJOINT似乎不起作用,它返回成千上万的重复值,我认为这是因为Netezza逐行运行查询并且每当两条特定的线不相交时返回一条记录? / p>
所以我想我只是标记数据集1中的每一行,然后只使用UPDATE DATSET 1 WHERE ST_INTERSECTS(dataset1,dataset2)选择那些没有标志的行。
然而,这会返回多对一关系错误。有没有办法可以让它只检查第一个交叉点或某些东西来阻止它尝试为单个记录分配多个值?
我觉得我的问题可能有一个更简单的解决方案(选择第1组中从不与第2组中的任何线相交的所有线),任何帮助都将非常感激。
干杯!
答案 0 :(得分: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)