2012-03-06 11 views
1

Oracleの一時表の更新を行っています。私の考えは、NVLを使って値を設定できるということでした(どちらかの側でヌル値を本質的にゼロにする)。セルフ結合の列がNULLでない場合、列自体と比較する方法はありますか?

この更新では、いくつかの比較が真の場合、列は更新されません。比較される列はNULLになり、OracleはNULL値を比較しません。

コードは、理解しやすくする場合があります。

UPDATE Temp_Table A Set T.ColZ = 'something' 
WHERE NOT EXISTS 
(SELECT * FROM Temp_Table B 
WHERE A.ColF = B.ColF 
AND ...more column comparisons 
AND ((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A')) 
    AND more column Comparisons) 
); 

更新がCOLCにNULLが含まれていないときに動作しますが、私はCOLCがNullの行を持っている場合、それは両側で同じであるにもかかわらず、更新されます。

私はwhere句でサブクエリを使用しようとしましたが、運はありませんでした。サブクエリはここで使用する方が良いでしょうか?

何か助けやヒントをいただければ幸いです。

これを追加したかったのですが、理想的には、その列がnullの場合は比較をすべてスキップしたいので、どのようにそのようにしても構いません。 おかげ

がYpers当たり数行と例を要求マイ更新が行を選び出すことになっている2. ...うまくいけば、それは、上記の表の行に

Temp_Table 
Col1 | Col2 | Col3 | Col4 |Col5 |Col6 
AB | DC | EF | GH | 08 | 
BA | CD | EF | GH | 08 | 
AB | DC | HI | NULL| 05 | 
AB | DC | JK | LM | 04 | 

行と1つのマッチ十分明らかです対応する行がない場合は3と4のようになります。私はCol4がNullではないが、その値がNullのときに失敗するときに動作させることができます。ちょうどFYi temp_tableでは、DC値Col1を持つCol2はその値としてABを持ち、Col2のCD値はCol1の値としてBAを持ちます。

UPDATE Temp_Table T SET Col6 = 'Unmatched' 
WHERE NOT EXISTS 
(SELECT * FROM Temp_Table B 
WHERE T.Col3 = B.Col3 
AND T.COl4 = B.Col4 
AND T.COl5 = B.Col5) 

希望と感謝。

((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A')) 

へ:

(A.ColC = B.ColC OR A.ColC IS NULL OR B.ColC IS NULL) 

質問のアップデート後、私が正しく理解していれば

+0

にその変更をなぜ '(A.ColC = B.ColC)'は動作しませんか? –

+0

投稿した内容に間違いはありません。他の場所に問題がある可能性があります。小さな、完全な 'temp_table'と問題を示す小さな完全な' UPDATE'ステートメントを投稿できますか? – ruakh

+0

@ypercube:「存在しない場所」に注意してください。ポイントは、 'Temp_Table A'のレコードが' NULL'でもレコードと一致する 'Temp_TableB'のレコードをサブクエリ*が見つけなければならないということですが、OPはそれが機能しないと信じています。 – ruakh

答えて

2

は、あなたが変更したいです。

あなたはこれを試みることができる:

UPDATE Temp_Table T 
SET Col6 = 'Unmatched' 
WHERE NOT EXISTS 
(SELECT * 
    FROM Temp_Table B 
    WHERE T.Col3 = B.Col3 
    AND T.COl4 = B.Col4 
    AND T.COl5 = B.Col5 

    AND NOT ( T.Col1 = B.Col1 --- all the other columns except Col6 
      AND T.Col2 = B.Col2 
      ) 
) 
+0

答えをありがとう、残念ながら、私はこの作業を必要な方法で行うことはできません。 Ruakhは、私は彼は、これらのマッチが存在しない場所は、更新が発生する場所だと言うとき正しいbtwです。そのことが明確になるかどうかは分かりません。私はそれに取り組んでいきます。ありがとう。 – dee

+0

@dee:いくつかの行を含む例題に問題を見つけることができれば、その問題が正確に何かを理解するのに役立ちます。 –

+0

私のポストで小さなtemp_tableの例を作った...明確にするのが分かりません。ありがとうございます。 – dee