我正在尝试搜索一个二维网格,其中每个单元格由表 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)
但是,坦率地说,我可以在运行期间重新粉刷西斯廷教堂。一定有更好的方法。