2016-03-23 21 views
0

私は2つの数のコレクション、1が含むn IDSとnの値を含むものを持って選択します。また、n個のレコードを含むselect文もあります。今、私はそれらに一緒に参加したいです。 は、直感的に、私はこのような何か実行しようとしました:だから PLSQL - Oracleのコレクション

select * from 
(
    select t.stat      StatNr 
     , t.statNr      StatValue 
     , t.statName     statusName 
    from myTable t 
    where t.nr = 1234 
    order by ... 
) status, 
(
    select statId.v StatNr 
     , statVal.v StatValue 
    from 
    (
    select column_value v 
     , rownum  r 
    from table(numberCollection(98, 45, 66, 153, 103, 67, 27)) 
) statId, 
    (
    select column_value v 
     , rownum  r 
    from table(numberCollection( 1, 2, 1, 1, 3, 2, 2)) 
) statVal 
    where statId.r = statVal.r 
) statusNew 
where status.StatNr = statusNew.StatNr 
    and status.StatValue <> statusNew.StatValue 

を、番号の収集せずにselect文は次のように返します。

ID VALUE NAME   
98 1  some varchar 
153 1  some varchar 
66 1  some varchar 
27 3  some varchar 
67 4  some varchar 
45 1  some varchar 
103 1  some varchar 

をそして私は、私からのIDのと値の対応を追加したいですコレクションは、私のテーブルから値の行が私のコレクションから値の列に異なるかどうかを確認した後、名前を戻します。

ので、結果は次のようになります。旧idと値がテーブルからのものであり、後者のidと値の列がコレクションからのもの

ID VALUE NAME   ID VALUE 
98 1  some varchar 98 1 
153 1  some varchar 153 1 
66 1  some varchar 66 1 
27 3  some varchar 27 2 
67 4  some varchar 67 2 
45 1  some varchar 45 2 
103 1  some varchar 103 3 

だから、最後にWHERE句:

and status.StatValue <> statusNew.StatValue 

が行4帰国、私に変更された値を持つレコードを与えるだろう - 今7.

を、これは私の視点から少し醜いです。特にwhere節でrownumを調べます。とにかく、私はOracleにとって比較的新しいですが、これには欠点やこれを実現するためのより良い方法がありますか?

+1

元のデータ構造と期待される結果を投稿 – Hawk

+0

ええ、申し訳ありませんが、私は私のポストを編集しました – Characeae

答えて

0

次の2つの独立したnumberCollectionsであなたのマッチング情報とあなたの比較データを持っているため、これら二つのリストを同期する唯一の方法は、ここでROWNUMある位置です。

しかし、あなたはWITH句を使用して、SQLが少し読みやすくすることができます:ここで

WITH comparedata AS (
SELECT statid.v StatNr, statval.v StatValue 
    FROM (
     select column_value v 
      , rownum  r 
     from table(numberCollection(98, 45, 66, 153, 103, 67, 27)) 
     ) statId, 
     (
     select column_value v 
      , rownum  r 
     from table(numberCollection( 1, 2, 1, 1, 3, 2, 2)) 
     ) statVal 
     where statId.r = statVal.r 
) 
select t.statNr 
    , t.statValue 
    , t.statName 
    from myTable t 
    JOIN comparedata d ON d.StatNr ON t.StatNr 
where t.nr = 1234 
    and status.StatValue <> statusNew.StatValue 
order by ... 

あなたがマッピングされたnumberCollectionsの結果と「comparedata」と呼ばれる名前のサブクエリを定義します。この後 は、あなたの本当のテーブルでのJOIN句で任意のビューまたはテーブルとして「comparedata」を使用します。

あなたの目標を達成する他の方法は、 "id = value; [id = value; ...]"のような形式の文字列を2つの列IDを持つコレクションに分割するVALUE。 このような仕事をもっと頻繁にやらなければならない場合は、そのような機能を作るのに時間を費やす価値があるのであれば、あなたは考えるかもしれません。

関連する問題