web-dev-qa-db-fra.com

Mise à jour SQL à partir d'une jointure interne

J'utilise Microsoft Access.

Si cette requête:

(SELECT FERMENT.FermentId
FROM FERMENT
INNER JOIN [BELGIUM BEER]
ON
FERMENT.FermentName = [BELGIUM BEER].FermentId ORDER BY [BELGIUM BEER].BeerId) a

renvoie FermentId, comment mettre à jour une table différente avec cette colonne?

Exemple:

UPDATE EXAMPLETABLE
SET EXAMPLETABLE.FermentId = a.FermentId
FROM a
(SELECT FERMENT.FermentId
FROM FERMENT
INNER JOIN [BELGIUM BEER]
ON
FERMENT.FermentName = [BELGIUM BEER].FermentId ORDER BY [BELGIUM BEER].BeerId) a
15
user1534664

En supposant que la sous-requête renvoie plusieurs valeurs, vous avez besoin d'une deuxième clé pour vous connecter (JOIN) entre les nouvelles valeurs et la table que vous souhaitez mettre à jour (EXAMPLETABLE).

Dans ce cas, j'essaierais quelque chose comme ceci:

UPDATE T 
SET    T.FERMENTID = A.FERMENTID 
FROM   EXAMPLETABLE AS T 
       INNER JOIN (SELECT FERMENT.FERMENTID, 
                          FERMENT.OTHERID 
                   FROM   FERMENT 
                          INNER JOIN [BELGIUM BEER] 
                                  ON FERMENT.FERMENTNAME = 
                                     [BELGIUM BEER].FERMENTID 
                   ORDER  BY [BELGIUM BEER].BEERID) AS A 
               ON A.OTHERID = T.OTHERID 

Si ce n'est pas le cas et que la sous-requête renvoie une seule valeur, essayez quelque chose comme ceci:

UPDATE EXAMPLETABLE 
SET    T.FERMENTID = (SELECT FERMENT.FERMENTID
                      FROM   FERMENT 
                             INNER JOIN [BELGIUM BEER] 
                                     ON FERMENT.FERMENTNAME = 
                                        [BELGIUM BEER].FERMENTID 
                      ORDER  BY [BELGIUM BEER].BEERID)

Notez que dans ce cas, vous devez garantir que la sous-requête ne retournera jamais plus d'une ligne!

7
Gidil

Je ne sais pas quelle est la relation d'EXAMPLETABLE avec vos données, mais en général.

Dans Access, la partie SET est après la jointure, ignorez également la partie sélectionnée dans l'ordre par. Devrait être quelque chose comme ça

UPDATE FERMENT
INNER JOIN ([BELGIUM BEER]  ON FERMENT.FermentName = [BELGIUM BEER].FermentId) 
SET EXAMPLETABLE.FermentColumn = a.FermentColumn

Si cela ne fonctionne pas, essayez de créer la jointure dans le générateur de requêtes

19
Arnoldiusss

Il n'est pas nécessaire de définir une relation entre les deux tables. La réponse 10 (Arnoldiusss) est presque correcte et de loin la solution la plus compréhensible et la plus courte. Et le plus rapide en exécution. Mais l'exemple de code est incorrect. Le code suivant provient d'une de mes applications et fonctionne correctement dans MS Access 2013.

    UPDATE table1 T1 
    INNER JOIN table2 T2 
    ON T2.Id = T1.Id
    SET T1.myField = T2.myField;

Pour "The Belgian Beer Case" (j'adore cette expression ;-) ce serait:

    UPDATE FERMENT AS T1
    INNER JOIN [BELGIUM BEER] AS T2 ON T1.FermentName = T2.FermentId 
    SET T1.FermentColumn1 = T2.FermentColumn1;
9
Cor Rutkowski