2017-10-12 21 views
0

J'ai un scénario dans lequel je souhaite mettre à jour plusieurs colonnes de la première table à partir de plusieurs lignes de la deuxième table. Mais le cas ne se met à jour qu'à partir de la première ligne de la deuxième table.Mise à jour à l'aide de cas dans SQL Server

Toute aide pour y parvenir sans utiliser le curseur?

create table Table1 (ColA varchar(20), ColB varchar(20), ColC varchar(20)) 

insert into Table1 values (1, null, null) 

create table Table2 (ColA varchar(20), ColB varchar(20), ColValue varchar(20)) 

insert into Table2 values (1, 2, 'X'), (1, 3, 'Y') 

update Table1 
set ColB = case 
       when T1.ColB = 2 
       then T1.ColValue 
       else T0.ColB 
      end, 
    ColC = case 
       when T1.ColB = 3 
       then T1.ColValue 
       else T0.ColC 
      end 
from Table1 T0 
inner join Table2 T1 on T0.ColA = T1.ColA 

select * from Table1 

En regardant le résultat, la déclaration a mis à jour que ColB

Répondre

0

ya un certain nombre de façons que cela pourrait se faire, voici une:

UPDATE t1 
    SET ColB = t2.ColValue 
    FROM Table1 AS t1 
    JOIN (SELECT * FROM Table2 WHERE Table2.ColB = 2) AS t2 
    ON t1.ColA = t2.ColA; 

UPDATE t1 
    SET ColC = t2.ColValue 
    FROM Table1 AS t1 
    JOIN (SELECT * FROM Table2 WHERE Table2.ColB = 3) AS t2 
    ON t1.ColA = t2.ColA; 

Cela ne comporte deux passages au-dessus chaque table, mais la syntaxe est très simple ce qui est toujours un bonus.

S'il est nécessaire d'utiliser une seule instruction essayer comme ceci:

UPDATE t1 
    SET ColB = ISNULL((SELECT TOP 1 ColValue FROM Table2 WHERE Table2.ColA = t1.ColA AND Table2.ColB = 2), t1.ColB), 
     ColC = ISNULL((SELECT TOP 1 ColValue FROM Table2 WHERE Table2.ColA = t1.ColA AND Table2.ColB = 3), t1.ColC), 
     ... 
    FROM Table1 AS t1; 

En utilisant ISNULL() pour éviter la mise à jour où il n'y a rien dans Table2.

+0

est simple, mais je vais avoir 12 à 20 colonnes où je dois valeur définie en fonction du type d'autre table. Ecrire une mise à jour pour chaque colonne n'est pas une bonne idée. –

+0

@RAJUSAGI Mis à jour pour afficher une seule instruction. C'est pourquoi il est utile d'inclure tous les détails pertinents dans la question originale:) – mendosi

+0

merci de la mise à jour. J'ai utilisé la même logique. le problème est la deuxième table elle-même une requête compliquée avec beaucoup de conditions. J'ai utilisé l'expression de table commune qui a été très utile dans ce cas. –

0
UPDATE Table1 
SET ColB = CASE WHEN T1.ColValue IS NOT NULL 
        THEN T1.ColValue 
        ELSE T0.ColB 
      END, 
    ColC = CASE WHEN T2.ColValue IS NOT NULL 
        THEN T2.ColValue 
        ELSE T0.ColC 
      END 
FROM Table1 T0 
INNER JOIN Table2 T1 ON T0.ColA = T1.ColA AND T1.ColB = 2 
INNER JOIN Table2 T2 ON T0.ColA = T2.ColA AND T2.ColB = 3 
+0

Non. Je devrai mettre à jour plus de 20 colonnes, en utilisant join pour chaque cas, le code semble compliqué –