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)
質問のアップデート後、私が正しく理解していれば
にその変更をなぜ '(A.ColC = B.ColC)'は動作しませんか? –
投稿した内容に間違いはありません。他の場所に問題がある可能性があります。小さな、完全な 'temp_table'と問題を示す小さな完全な' UPDATE'ステートメントを投稿できますか? – ruakh
@ypercube:「存在しない場所」に注意してください。ポイントは、 'Temp_Table A'のレコードが' NULL'でもレコードと一致する 'Temp_TableB'のレコードをサブクエリ*が見つけなければならないということですが、OPはそれが機能しないと信じています。 – ruakh