2010-01-17 4 views
3

J'essaie de mettre à jour plusieurs colonnes dans une instruction MS SQL à l'aide d'une sous-requête. Une recherche m'a conduit à quelque chose comme:Mise à jour de plusieurs colonnes dans SQL avec l'identificateur multi-parties lié

UPDATE table1 
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 FROM 
(SELECT col1, col2, col3 from table2 where <expression>) AS a 
WHERE table1.col1 <expression> 

http://geekswithblogs.net/phoenix/archive/2009/10/13/update-multiple-columns-on-sql-server.aspx

Mon problème est que dans l'expression WHERE intérieure je besoin d'une référence à un domaine spécifique dans le tableau 1:

UPDATE table1 
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 FROM 
(SELECT col1, col2, col3 from table2 where table1.col0 = table2.col0) AS a 
WHERE table1.col1 <expression> 

Quand je lance cette requête que je reçois "L'identificateur en plusieurs parties" table1.col0 "n'a pas pu être lié. Apparemment, lorsque vous utilisez cette syntaxe, SQL ne peut pas lier l'enregistrement table1 en cours dans la sous-requête. En ce moment, je répète la sous-requête pour chaque champ et en utilisant la syntaxe:

UPDATE table1 
SET col1 = (subquery), col2 = (subquery)... 

Mais qui exécute la sous-requête (ce qui est très cher) une fois par colonne, que je voudrais éviter.

Des idées?

Répondre

8

Dans le serveur SQL, vous pouvez utiliser une clause from dans une requête de mise à jour. Rejoignez les tables comme vous le feriez dans un select. La table que vous mettez à jour doit être incluse dans les jointures.

update table_1 
    set field_1 = table_2.value_1 
    from table_1 
    inner join table_2 
     on (table_1.id = table_2.id) 
1

Ou si vous n'aimez pas la syntaxe se joindre à cette travaillerai également:

UPDATE table1 
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 
FROM table1, table2 as a 
WHERE table1.col0 = a.col0 
AND table1.col1 <expression> 
2

Votre utilisation de la voiture commande apply CROSS de mettre à jour plusieurs colonnes de sous sélectionnez

UPDATE t1 
SET t1.col1 = a.col1, t1.col2 = a.col2, t1.col3 = a.col3 
FROM table1 t1 
CROSS APPLY 
(SELECT col1, col2, col3 from table2 where table1.col0 = table2.col0) a(col1,col2,col3) 
Questions connexes