SDO_NN 演算子を使用して、建物の隣にある最も近い消火栓を見つけています。
建物:
CREATE TABLE "BUILDINGS"
(
"NAME" VARCHAR2(40),
"SHAPE" "SDO_GEOMETRY")
消火栓:
CREATE TABLE "HYDRANTS"
( "NAME" VARCHAR2(10),
"POINT" "SDO_POINT_TYPE"
);
building.shape の空間インデックスを適切に設定し、クエリを実行して、建物「Motel」に最も近い消火栓を取得します。
select b1.name as name, h.point.x as x, h.point.y as y from buildings b1, hydrants h where b1.name ='Motel' and
SDO_nn( b1.shape, MDSYS.SDO_GEOMETRY(2003,NULL, NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),
SDO_ORDINATE_ARRAY( h.point.x,h.point.y)), 'sdo_num_res=1')= 'TRUE';
問題は次のとおりです。
パラメータsdo_num_res=1を設定すると、タプルがゼロになります。そして、sdo_num_res=2 にすると、タプルが 1 つ取得されます。
奇妙な動作の理由は何ですか?
注: building.name= 'Motel' の場合にのみ 0 行を取得しています。他のすべてのタプルでは、sdo_num_res = 1 の場合に 1 行を取得しています。
編集:クエリを挿入
Insert into buildings (NAME,SHAPE) values ('Motel',MDSYS.SDO_GEOMETRY(2003,NULL,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),MDSYS.SDO_ORDINATE_ARRAY(564,425,585,436,573,458,552,447)));
Insert into hydrants (name,POINT) values ('p57',MDSYS.SDO_POINT_TYPE(589,448,0));