2012-10-14 13 views
9

Używam programu Microsoft Access.SQL Aktualizowanie z wewnętrznego połączenia

Jeśli to zapytanie:

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

zwraca FermentId, w jaki sposób mogę zaktualizować innej tabeli z tej kolumny?

Przykład:

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

Jeśli ja nie mylę trzeba zależność pomiędzy 'EXAMPLETABLE' i rzeczy do wyboru, niż można użyć coś takiego' UPDATE EXAMPLETABLE SET EXAMPLETABLE.FermentId = (wybierz FERMENT.FermentId oD ferment INNER JOIN [BELGIA PIWO ] ON FER MENT.FermentName = [BELGIUM PIWO] .FermentId WHERE EXAMPLETABLE.relationFieldName = [BELGIUM PIWO] .relationField ORDER BY [BELGIUM PIWO] .BeerId) ' – xception

Odpowiedz

7

Zakładając, że sub-zapytanie zwraca więcej niż jedną wartość, trzeba drugi klucz do połączenia (JOIN) między nowymi wartościami a tabelą, którą chcesz zaktualizować (EXAMPLETABLE).

W tym przypadku chciałbym spróbować coś takiego:

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 

Jeśli nie jest to przypadek, a sub-zapytanie zwraca pojedynczą wartość, spróbuj coś takiego:

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) 

Pamiętaj, że w tym przypadku musisz zagwarantować, że pod-zapytanie nigdy nie zwróci więcej niż jednego wiersza!

+1

Lol, właśnie napisałem to w komentarzu, mniej słów. Masz mój głos! – xception

+0

Masz na myśli kolumnę lub rekord z rzędem? – user1534664

+0

Wiersz! Jeśli pod-zapytanie zwraca więcej niż jeden wiersz, SQL nie będzie wiedział, która wartość ma aktualizować tabelę. :-) – Gidil

15

Nie wiesz, co relacja EXAMPLETABLE z danymi jest, ale w ogóle.

W Dostęp do części SET po złączeniu, pomiń również część wybraną w kolejności według. Powinno być coś takiego

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

Jeśli doent praca próby budowania przyłączyć konstruktora zapytań

3

Nie ma potrzeby definiowania relacji między dwiema tabelami. Odpowiedź 10 (Arnoldiusss) jest prawie poprawna i zdecydowanie najbardziej zrozumiała i najkrótsza. I najszybszy w wykonaniu. Ale przykładowy kod jest nieprawidłowy. Kolejny kod pochodzi z jednego z moich aplikacji i działa dobrze w MS Access 2013.

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

za „Belgian Beer przypadek” (uwielbiam to wyrażenie ;-) byłoby:

UPDATE FERMENT AS T1 
    INNER JOIN [BELGIUM BEER] AS T2 ON T1.FermentName = T2.FermentId 
    SET T1.FermentColumn1 = T2.FermentColumn1; 
Powiązane problemy