1

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 )

お役に立てば幸いです。

4

1 に答える 1

2

私が正しく理解している場合、あなたは変更したいと思います:

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

に:

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

質問の更新後。

あなたはこれを試すことができます:

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
            )
)
于 2012-03-06T22:55:11.523 に答える