2010-05-12 8 views
33

J'ai customer et address tables.requête de mise à jour avec joindre sur deux tables

Requête:

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

renvoie 474 enregistrements

Pour ces documents, je voudrais ajouter le id de la table dans customercid de la table address.

Exemple: Si pour le premier enregistrement de l'identifiant client est 9 et id d'adresse est également 9 alors je voudrais insérer 9 dans la colonne cid de table d'adresses.

J'ai essayé:

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

mais cela ne semble pas fonctionner.

Répondre

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

Un 'join' combine des colonnes d'une ou plusieurs tables, un' in' est juste une liste d'ids (même si vous les obtenez d'un autre 'select'). Cette réponse n'est pas pertinente à la question. – ronedg

3

Officiellement, les langues SQL ne supporte pas JOIN ou clause FROM dans une instruction UPDATE à moins qu'il est dans une sous-requête. Ainsi, l'approche Hoyle ANSI serait quelque chose comme

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 
       ) 

Cependant, de nombreux SGBDR tels Postgres soutiennent l'utilisation d'un dans une instruction UPDATE clause FROM. Dans de nombreux cas, vous devez inclure la table de mise à jour et alias il dans la clause FROM mais je ne suis pas sûr de Postgres:

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

Postgres ne nécessite pas d'inclure la table de mise à jour dans la clause 'FROM'. En fait, la [documentation] (http://www.postgresql.org/docs/current/static/sql-update.html) indique que *** "la table cible ne doit pas apparaître dans le' from_list', sauf si vous l'intention d'une auto-adhésion "***. Par conséquent, cela peut conduire à de mauvais résultats de mentionner la table dans la clause 'FROM' à moins que vous ne souhaitiez que la table se joigne à elle-même. ** N.B. ** Vous pouvez alias la table de mise à jour dans la clause 'UPDATE'. – ADTC

+0

AVERTISSEMENT - L'exécution d'une mise à jour dans ce format cible toutes les lignes de la table d'adresses. –

+0

@RyanWilliams - Les deux formats mettront à jour toutes les lignes qui ont un client, oui. C'était la demande. – Thomas

-3

Essayez celui

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

Cela n'a absolument rien à voir avec la question (et c'est SQL non valide aussi) –

3

Utilisation des alias de table dans la conditions de jointure:

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