2017-05-18 21 views
0

私はいくつかの情報を抽出する必要があるテーブル形式を持っています。この表にはoracle spatial(MDSYS.SDO_GEOMETRY)列があります。この列からもデータが必要です。Oracle:MDSYS.SDO_GEOMETRY列からデータを抽出

私はこのような単純なクエリで始まっ:その後

select id, field1, field2 
FROM my_table; 

、私は空間列にあったデータを抽出するために、結果をループすることができた:

SELECT * 
     FROM TABLE (SELECT a.POSITIONMAP.sdo_ordinates 
          FROM my_table 
          WHERE ID = 18742084); 

POSITIONMAP.sdo_ordinatesは通常次のような4つの値を保持しているようです:

100050,887 
407294,948 
0,577464740471056 
-0,816415625470689 

私は最後が必要です2値。ので、私のクエリは非常に迅速に遅くなり、POSITIONMAP列からデータを抽出するために私の最初のクエリからすべての行を超えるループ

SELECT * FROM 
    (SELECT rownum AS num, 
      column_value AS orientatie 
     FROM TABLE (SELECT a.POSITIONMAP.sdo_ordinates 
          FROM my_table 
          WHERE ID = 18742084)) 
    WHERE num IN (3,4) 

もちろん非常にパフォーマンスフレンドリーではありません:私はこれにクエリを変更していることを達成することができます。

私はすべての情報を1つのクエリで取得したいと思いますが、私がそうしないようにするいくつかのことがあります。

  • は、テーブル内のすべての行がPOSITIONMAP
  • 内のデータを持っていないいくつかの行がPOSITIONMAP内のデータを持っているが、彼らは唯一の2つの値(そうではない第三、私は探しています第四値。
  • が含まれています私は重複行

私が得た最も近いことになる前のクエリを使用した(表の1行ごとに1行のデータをされる必要があります。

select 
    id, 
    field1, 
    field2 
    t.* 
    FROM my_table v, 
    table (v.POSITIONMAP.sdo_ordinates) t 

これは、my_tableのすべての行に対して4行を与えます。 rownum条件をこのクエリーに入れようとすると、「invalid user.table.column、table.column、or column specification」というメッセージが表示されます。

私が欲しいものを組み合わせる方法はありますか1つのクエリを行うには?

答えて

1

次のようにあなたがSDO_UTIL.GETVERTICESを使用することができます。

select t.x,t.y 
    from my_table mt 
     ,table(sdo_util.getvertices(mt.positionmap)) t 
where t.id = 2 

私は(GTYPE = 2002あなたの形状がラインであることを仮定しています)とポイント(gtype = 2001)。行のX、Y値とポイントの空の値が必要な場合は、ジオメトリオブジェクトのsdo_gtypeプロパティでフィルタリングできます。

select t.x,t.y 
    from my_table mt 
     ,table(sdo_util.getvertices(mt.positionmap)) t 
where t.id = 2 
and mt.positionmap.sdo_gtype=2002 
union all 
select null as X, 
     null as Y 
from my_table mt 
where mt.positionmap.sdo_gtype=2001 
+0

ありがとうございます、それは私の目的にとって非常に便利な機能です!しかし、POSITIONMAPにはデータがありますが、値は2つしかありません(探している第3、第4の値ではないので、値が2のt.idはありません。私はこれらの行を失うことはありませんので、xとyの代わりにnullを取得するように、何らかのlefgt結合を行う方法はありますか? – ErikL

+0

私の答えを編集しました – Rene

0

一つの方法は、ROW_NUMBER()分析関数を使用することです:

SELECT * 
FROM (
    select id, 
     field1, 
     field2, 
     t.*, 
     ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY ROWNUM) AS rn 
    FROM my_table v, 
     TABLE(v.POSITIONMAP.sdo_ordinates) t 
) 
WHERE rn IN (3, 4) 
関連する問題