2017-02-20 11 views
0

いくつかのケースステートメントで更新クエリを書いていました。大文字と小文字を区別しない場合は、NULLで列を更新します。それは常にNULL移入され
サブクエリとケースステートメントを使用した更新

UPDATE TGT 
SET C1 = CASE WHEN TGT.c2 = SRC.c2 AND SRC.C3 = 'P' THEN SRC.C1 ELSE NULL END, 
    C4 = CASE WHEN TGT.c5 = SRC.c5 AND SRC.C3 = 'D' THEN SRC.C4 ELSE NULL END 
    FROM SRC; 

も、データがソーステーブルに存在されています。以下の
はクエリです。

ありがとうございました。

+0

このクエリは何も更新せずに実行されますか、エラーが発生しますか? – Aleksej

+0

いいえ、これは単一のクエリです。テーブル内のすべてのレコードを更新しますが、NULL値のみを更新します。 – Biswabid

+0

これはオラクルですか? – Aleksej

答えて

2

update文では、fromまたはjoinをサポートしていません。ただし、サブクエリを使用することができます。

UPDATE TGT 
    SET C1 = (CASE WHEN EXISTS (SELECT 1 
           FROM SRC 
           WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P' 
        THEN TGT.C1 ELSE NULL 
       END); 

注:上記はすべての行を更新します。あなただけ一致しない行を更新する場合は、where句でnot existsを使用します。

UPDATE TGT 
    SET C1 = NULL 
    WHERE NOT EXISTS (SELECT 1 
         FROM SRC 
         WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P' 
        ); 
+0

これは、1列のみを更新する場合に試行できます。複数の列を更新する必要がある場合は、それは役に立ちません。パフォーマンスの問題が発生する可能性があります。何かご意見は?? – Biswabid

+0

@Biswabid:複数の列を更新する必要がある場合は、 'set(c1、c2、c3)=(select x1、x2、x3 from ...) –

0

あなたはsrcには、関連する「P」レコードが存在しないc1はnullを設定したいです。したがってNOT EXISTSを使用します。

UPDATE tgt 
SET c1 = NULL 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM src 
    WHERE src.c2 = tgt.c2 = AND src.c3 = 'P' 
); 

UPDATE:あなたはちょうどあなたの質問を変更しているし、それは今、2つの異なる状況にnullを設定したい2つの異なるフィールドです。私はあなたが単に2つのステートメントを使用することをお勧めします:上記のc1と同様のc4の場合。実際よりも複雑にする必要はありません。

関連する問題