0

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

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

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

当我知道起点时,我可以这样做(假设起点是 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>

我目前已经使用 JDBC 在 java 中实现了这个,它执行第二个查询以选择可能的起点,对于返回的每一行,我执行第一个查询。这是非常非常缓慢的。

我一直在尝试找到将子查询的结果强制放入我的第一个查询的 IN 子句或 BETWEEN 子句的方法,这样对于潜在起点列表,我只返回 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)

但是,坦率地说,我可以在运行期间重新粉刷西斯廷教堂。一定有更好的方法。

4

0 回答 0