2010-05-12 21 views
33

Ich habe customer und address Tabellen.Update-Abfrage mit Join auf zwei Tabellen

Abfrage:

SELECT * 
FROM addresses a, 
    customers b 
WHERE a.id = b.id 

gibt 474 Datensätze

Für diese Aufzeichnungen, ich möchte die id von customer Tabelle in cid von address Tabelle hinzuzufügen.

Beispiel: Wenn für den ersten Datensatz der ID des Kunden 9 und id der Adresse ist auch 9 dann würde Ich mag 9 in cid Spalte der Adresstabelle einzufügen.

Ich habe versucht:

UPDATE addresses a, 
     customers b 
SET a.cid = b.id 
WHERE a.id = b.id 

aber das scheint nicht zu funktionieren.

Antwort

1
update addresses set cid=id where id in (select id from customers) 
+0

Ein 'Join' kombiniert Spalten aus einer oder mehreren Tabellen, ein' in' ist nur eine Liste von IDs (auch wenn Sie sie von einem anderen 'Select' erhalten). Diese Antwort ist für die Frage irrelevant. – ronedg

3

Offiziell ist die SQL-Sprachen ein nicht unterstützen FROM-Klausel JOIN oder in einer Anweisung UPDATE es sei denn, es ist in einer Unterabfrage. Somit wäre der Hoyle ANSI Ansatz so etwas wie

Update addresses 
Set cid = (
      Select c.id 
      From customers As c 
      where c.id = a.id 
      ) 
Where Exists (
       Select 1 
       From customers As C1 
       Where C1.id = addresses.id 
       ) 

jedoch viele DBMS-Systeme wie zum Postgres der Verwendung eines FROM-Klausel in einer UPDATE-Anweisung zu unterstützen. In vielen Fällen sind erforderlich, um Ihnen die Aktualisierung Tabelle und die Alias ​​es in der FROM-Klausel enthalten, aber ich bin nicht sicher über Postgres:

Update addresses 
Set cid = c.id 
From addresses As a 
    Join customers As c 
     On c.id = a.id 
+4

Postgres benötigt keine Aktualisierungstabelle in der 'FROM'-Klausel. In der Tat besagt die [Dokumentation] (http://www.postgresql.org/docs/current/static/sql-update.html), dass *** "die Zieltabelle nicht in der' from_list' erscheinen darf, außer Sie beabsichtige einen Self-Join "***. Daher kann es zu falschen Ergebnissen kommen, wenn Sie die Tabelle in der FROM-Klausel erwähnen, es sei denn, Sie möchten, dass die Tabelle mit sich selbst verknüpft wird. ** N.B. ** Sie können die Aktualisierungstabelle in der Klausel 'UPDATE' umbenennen. – ADTC

+0

WARNUNG - Das Ausführen eines Updates in diesem Format gilt für alle Zeilen in der Adresstabelle. –

+0

@RyanWilliams - Beide Formate werden alle Zeilen aktualisieren, die einen Kunden haben, ja. Das war die Bitte. – Thomas

-3

versuchen diese

UPDATE employee 
set EMPLOYEE.MAIDEN_NAME = 
    (SELECT ADD1 
    FROM EMPS 
    WHERE EMP_CODE=EMPLOYEE.EMP_CODE); 
WHERE EMPLOYEE.EMP_CODE >='00' 
AND EMPLOYEE.EMP_CODE <='ZZ'; 
+0

Das hat absolut nichts mit der Frage zu tun (und es ist auch ungültiges SQL) –

3

Tabellen-Aliases in der Verwendung Join-Bedingung:

update addresses a 
set cid = b.id 
from customers b 
where a.id = b.id