Oracleの一時テーブルを更新しています。私の考えでは、NVLを使用して値を設定できます(基本的に、どちらかの側のnull値を等しくします)
更新で何が起こるかというと、いくつかの比較が当てはまる場合、列は更新されず、それらの比較された列の1つが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ごとに、数行の例をリクエストします...うまくいけば十分に明確です
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は行2と一致しています。私の更新では、対応する行がない3や4などの行を選択することになっています。Col4がNullでない場合は機能させることができますが、その値がNullの場合は失敗します。temp_tableのFYiだけで、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 )
お役に立てば幸いです。