2012-10-14 3 views
9

J'utilise Microsoft Access.Mise à jour SQL à partir d'une jointure interne

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 

retourne FermentId, comment puis-je mettre à jour une autre table 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 
+1

Si Je ne me trompe pas, vous avez besoin d'une relation entre 'EXAMPLETABLE' et la chose que vous sélectionnez à partir, que vous pouvez utiliser quelque chose comme' UPDATE EXAMPLETABLE SET EXAMPLETABLE.FermentId = (SELECT FERMENT.FermentId dE FERMENT INNER JOIN [BELGIQUE BIÈRE ] ON FER MENT.FermentName = [BIÈRE DE BELGIQUE] .FermentId WHERE EXAMPLETABLE.relationFieldName = [BIÈRE DE BELGIQUE] .relationField ORDER BY [BIÈRE DE BELGIQUE] .BeerId) ' – xception

Répondre

7

En supposant que le retourne sous-requête plus d'une valeur, il faut une deuxième clé pour se connecter (JOIN) entre les nouvelles valeurs et la table que vous souhaitez mettre à jour (EXAMPLETABLE).

Dans ce cas, je voudrais essayer 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 la sous-requête renvoie une seule valeur, essayer 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!

+1

Lol, je viens d'écrire cela dans un commentaire, en moins de mots cependant. Vous avez mon vote! – xception

+0

Voulez-vous dire colonne ou enregistrement avec ligne? – user1534664

+0

Ligne! Si la sous-requête renvoie plus d'une ligne, SQL ne saura pas avec quelles valeurs mettre à jour la table. :-) – Gidil

15

Je ne sais pas ce que la relation de EXAMPLETABLE avec vos données, mais en général.

Dans Access la partie SET est après la jointure, sautez également la partie select dans l'ordre. devrait être quelque chose comme ça

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

Si ce bâtiment doent essayer travail le rejoindre dans le générateur de requête

3

Il n'est pas nécessaire de définir une relation entre les deux tables. 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 le code d'exemple est faux. Le code suivant vient d'un de mes applications et fonctionne très bien dans MS ACCESS 2013.

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

Pour « l'affaire de la bière belge » (j'adore cette expression ;-) il serait:

UPDATE FERMENT AS T1 
    INNER JOIN [BELGIUM BEER] AS T2 ON T1.FermentName = T2.FermentId 
    SET T1.FermentColumn1 = T2.FermentColumn1; 
Questions connexes