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