2017-02-20 4 views
0

J'écrivais une requête de mise à jour avec des instructions de cas. lorsque le cas ne satisfait pas, la colonne sera mise à jour avec la valeur NULL.
Ce qui suit est la requête:
Mise à jour à l'aide des instructions de sous-requête et de requête

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; 

Il est toujours NULL peuplait même les données sont en vigueur dans la table source.

Merci D'avance pour de l'aide.

+0

Cette requête est-elle exécutée, sans rien mettre à jour, ou donne-t-elle une erreur? – Aleksej

+0

Nope, Ceci est une requête unique. Il met à jour tous les enregistrements de la table mais avec la valeur NULL SEULEMENT. – Biswabid

+0

Et est-ce Oracle? – Aleksej

Répondre

2

Oracle ne prend pas en charge from ou join dans l'instruction update. Toutefois, vous pouvez utiliser une sous-requête:

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); 

Remarque: Les éléments ci-dessus mettent à jour toutes les lignes. Si vous voulez juste de mettre à jour les lignes qui ne correspondent pas, utilisez not exists dans la clause where:

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

Cela peut être essayé lorsque nous mettons à jour seulement 1 colonne. Si plus de 1 colonnes doivent être mises à jour, cela n'aidera pas. Cela pourrait aussi donner des problèmes de performance. Des pensées?? – Biswabid

+0

@Biswabid: si vous avez besoin de mettre à jour plus d'une colonne, utilisez quelque chose comme 'set (c1, c2, c3) = (sélectionnez x1, x2, x3 à partir de ...)' –

0

que vous souhaitez définir c1 null où aucun enregistrement « P » lié à src existe. Utilisez donc NOT EXISTS:

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

MISE À JOUR: Vous venez de changer votre question et il est maintenant deux champs différents que vous souhaitez définir null dans deux cas différents. Je suggère que vous utilisez simplement deux déclarations alors: Ce qui précède pour c1 et un similaire pour c4. Pas besoin de rendre les choses plus compliquées qu'elles ne le sont en réalité.