选择具有多个起点的点周围的单元格

时间:2014-09-22 21:15:21

标签: sql cartesian-coordinates

我正在尝试搜索二维网格,其中每个单元格由表mapdata中的一行表示,如下所示;

x-loc
y-loc
attrib1
attrib2
...
attribN

我在x-loc和y-loc上有单独的索引以及我感兴趣的每个attrib值的单独索引。要选择一个单元格,我需要检查周围单元格中的一些属性我感兴趣的起点。

当我知道起点时,我可以这样做(假设起点是10,10,查询类似;

select * from mapdata 
where x-loc in (10-2, 10-1, 10+1,10+2) 
    and y-loc in (10-2,10-1,10+1,10+2) 
    and attrib3=<some value> 
    and attrib4 in (<value1>, <value2>) 

这将为我提供一个包含10,10起点的单元格列表,这些单元格具有我感兴趣的属性。

但是我现在需要扩展它,以便我有一个查询选择的多个可能的起点。例如,我用

获得了潜在的起点
select x-loc, y-loc, sum(attrib5) from mapdata 
where attrib1 = <value> 
and attrib2 in (<value>,,value>

我目前在java中使用JDBC执行此操作,执行第二个查询以选择可能的起点,并且对于返回的每一行,我执行第一个查询。这非常非常慢。

我一直试图找到将子查询的结果强制转换为我的第一个查询或BETWEEN子句的IN子句的方法,以便对于潜在起点列表,我只返回x-loc和y.loc那些起始点,其周围的单元格符合指定的条件。

首先,我正在尝试做的事实可能吗?如果是的话,请有人指出我正确的方向。

此致

我现在设法得到了表达我意图的工作

select c.x,c.y from mapdata a
inner join (select b.x, b.y from mapdata b 
    where b.food = 7 
    and b.terrain_id !=13) c
    on a.x between c.x-2 and c.x +2
    and a.y between c.y-2 and c.y+2
where a.terrain_id in (13,16)
但是,坦率地说,我可以在它运行的时候重新绘制西斯廷教堂。必须有更好的方法。

0 个答案:

没有答案