2009-10-16 5 views
1

J'utilise SQL Server 2008, et essayez d'exécuter la requête suivante en studio de gestion:UPDATE dans SQL Do utilisant JOIN

 UPDATE 
     Table1 as T1 INNER JOIN Table2 as T2 ON T1.ID=T2.ID 
     SET T1.SomeValue = T2.SomeValue 

     GO 

Ne fonctionne pas bien. Est-ce que ce genre de chose est supporté?

Karl

[EDIT] Laissez-moi être un peu plus clair, je wan't faire quelque chose comme:

 UPDATE 
     Table1 as T1 INNER JOIN Table2 as T2 ON T1.ID=T2.ID 
     SET T1.SomeValue = T2.SomeValue 
     T1.SomeValue2 = T2.SomeValue2 
     T1.SomeValue3 = T2.SomeValue3 
     T1.SomeValue4 = T2.SomeValue4 

     GO 

-à-dire sans avoir à faire explicitement T1.SomeValue = SELECT ... , T2.SomeValue = SELECT ...

Répondre

7

il devrait fonctionner si vous réécrivez semblable à ceci:

UPDATE Table1 
SET Table1.SomeValue = T2.SomeValue 
FROM Table2 AS T2 
WHERE Table1.ID = T2.ID 
2

Essayez cette

DECLARE @Table1 TABLE(
     ID INT, 
     Val VARCHAR(MAX) 
) 

DECLARE @Table2 TABLE(
     ID INT, 
     Val VARCHAR(MAX) 
) 

INSERT INTO @Table1 (ID,Val) SELECT 1, '' 
INSERT INTO @Table1 (ID,Val) SELECT 2, '' 
INSERT INTO @Table1 (ID,Val) SELECT 3, '' 

INSERT INTO @Table2 (ID,Val) SELECT 1, 'a' 
INSERT INTO @Table2 (ID,Val) SELECT 2, 'a' 

UPDATE @Table1 
SET Val = t2.Val 
FROM @Table1 t1 INNER JOIN 
     @Table2 t2 ON t1.ID = t2.ID 


SELECT * FROM @Table1 
0

Je pense que

UPDATE Table1 as T1... 

se traduirait par l'alias étant mis à jour et la table réelle restant inchangé.

Vous pouvez utiliser une sous-requête scalaire, par ex.

UPDATE Table1 
    SET SomeValue = (
        SELECT T2.SomeValue 
         FROM Table2 as T2 
        WHERE T2.ID = Table1.ID 
        ); 
0

Update T1 = mis T1.Col1 T2.Col2 jointure interne T2 T1.Id = T2.FId

1

Evitez d'utiliser le "UPDATE avec une jointure" fonctionnalité dans SQL Server 2008. Utiliser MERGE au lieu . MERGE est un langage SQL standard (contrairement à la syntaxe de jointure UPDATE), il fonctionne souvent mieux et est plus fiable car il ne souffre pas des mêmes failles que la syntaxe propriétaire UPDATE de Microsoft.