次のように、各セルがテーブル mapdata の行で表される 2 次元グリッドを検索しようとしています。
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 で実装しています。これは、2 番目のクエリを実行して可能な開始点を選択し、返された行ごとに最初のクエリを実行します。これは非常に遅いです。
サブクエリの結果を最初のクエリの 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)
しかし、率直に言って、これを実行するのにかかる時間内に、システィーナ礼拝堂を塗り直すことができました. もっと良い方法があるはずです。