2012-10-14 5 views
9

Ich verwende Microsoft Access.SQL-Aktualisierung von einem inneren Join

Wenn diese Abfrage:

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

kehrt FermentId, wie aktualisiere ich eine andere Tabelle mit dieser Spalte?

Beispiel:

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

Wenn ich bin nicht falsch Sie eine Beziehung zwischen 'EXAMPLETABLE' brauchen, und das, was Sie auswählen, als Sie so etwas wie' UPDATE EXAMPLETABLE SET EXAMPLETABLE.FermentId = (SELECT FERMENT.FermentId vON FERMENT INNER JOIN [belgisches Bier verwenden könnte ] ON FER MENT.FermentName = [BELGIUM BIER] .FermentId WHERE EXPPLETABLE.relationFieldName = [BELGIEN BIER] .relationField ORDER BY [BELGIEN BIER] .BeerId) ' – xception

Antwort

7

Unter der Annahme, in der Query Builder verbinden bauen, dass die Unterabfrage mehr als einen Wert zurückgibt, können Sie einen zweiten Schlüssel, zu verbinden (JOIN) zwischen den neuen Werten und der Tabelle, die Sie aktualisieren möchten (EXPLEPLETABLE).

In diesem Fall würde ich so etwas wie dies versuchen:

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 

Ist dies nicht der Fall ist und die Unterabfrage gibt einen einzelnen Wert, versuchen, etwas wie folgt aus:

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) 

Beachten Sie, dass Sie in diesem Fall sicherstellen müssen, dass die Unterabfrage niemals mehr als eine Zeile zurückgibt!

+1

Lol, ich habe das nur in einem Kommentar geschrieben, in weniger Worten. Du hast meine Stimme bekommen! – xception

+0

Meinst du Spalte oder Datensatz mit Zeile? – user1534664

+0

Reihe! Wenn die Unterabfrage mehr als eine Zeile zurückgibt, weiß SQL nicht, mit welchem ​​der Werte die Tabelle aktualisiert werden soll. :-) – Gidil

15

nicht sicher, was das Verhältnis von EXAMPLETABLE mit Ihren Daten ist, aber im Allgemeinen.

In Access der SET-Teil ist nach dem Beitritt, überspringen Sie auch den Auswahlteil in der Reihenfolge von. Sollte so etwas wie dieses

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

sein, wenn es Arbeit doent versuchen die

3

Es ist nicht erforderlich, eine Beziehung zwischen den beiden Tabellen zu definieren. Antwort 10 (Arnoldiuss) ist fast richtig und bei weitem die verständlichste und kürzeste Lösung. Und das schnellste in Ausführung. Aber der Beispielcode ist falsch. Der nächste Code kommt von einem meiner Anwendungen und läuft gut in MS ACCESS 2013.

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

Für die "Belgian Beer Case" (Ich liebe diesen Ausdruck ;-) es wäre:

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