2010-05-12 9 views
33

Mam tabele customer i address.Aktualizacja zapytania z łączeniem na dwóch tabelach

Zapytanie:

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

zwraca 474 rekordy

Dla tych zapisów, chciałbym dodać id z customer tabeli do cid z address tabeli.

Przykład: Jeżeli dla pierwszego rekordu identyfikator klienta jest 9 i id adresu jest 9 Wtedy i jak do wkładki 9 do cid kolumnie tablicy adresów.

Próbowałem:

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

ale to nie wydają się działać.

Odpowiedz

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

"Łączyć" łączy kolumny z jednej lub więcej tabel, "w" to tylko lista identyfikatorów (nawet jeśli otrzymasz je z innego 'wybierz'). Ta odpowiedź nie ma znaczenia dla pytania. – ronedg

3

Oficjalnie języków SQL nie obsługuje JOIN lub klauzuli FROM w instrukcji UPDATE, chyba że jest w podkwerendy. Zatem podejście Hoyle ANSI byłoby coś

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 
       ) 

Jednak wielu DBMS takie Postgres wspierających wykorzystanie klauzuli FROM w instrukcji UPDATE. W wielu przypadkach, które są wymagane w celu włączenia tabeli aktualizacji i alias go w klauzuli FROM jednak nie jestem pewien PostgreSQL:

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

Postgres nie wymaga uwzględnienia tabeli aktualizacji w klauzuli "OD". W rzeczywistości, [documentation] (http://www.postgresql.org/docs/current/static/sql-update.html) stwierdza, że ​​*** "tabela docelowa nie może pojawić się w' from_list', chyba że ty zamierzają połączyć się "***. Dlatego może to prowadzić do błędnych wyników, aby wspomnieć tabelę w klauzuli "Z", chyba że chcesz, aby stół się złączył. ** N.B. ** Możesz pseudo aktualizować tabelę w klauzuli "UPDATE". – ADTC

+0

OSTRZEŻENIE - Wykonywanie aktualizacji w tym formacie będzie dotyczyć wszystkich wierszy w tabeli adresów. –

+0

@RyanWilliams - Oba formaty zaktualizują wszystkie wiersze, które mają klienta, tak. To była prośba. – Thomas

-3

Spróbuj jeden

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

Nie ma to absolutnie nic wspólnego z pytaniem (a także z nieważnym SQL) –

3

Używając aliasów tabel w dołączyć warunku:

update addresses a 
set cid = b.id 
from customers b 
where a.id = b.id 
Powiązane problemy