1482 votes

Comment puis-je faire une déclaration UPDATE avec JOIN dans SQL Server ?

J'ai besoin de mettre à jour cette table dans SQL Server avec les données de son tableau "parent", voir ci-dessous :

Tableau : vente

id (int)
udid (int)
assid (int)

Tableau : ud

id  (int)
assid  (int)

sale.assid contient la valeur correcte à mettre à jour ud.assid .

Quelle requête peut faire ça ? Je pense à une join mais je ne suis pas sûr que ce soit possible.

0 votes

Des relations entre les tables ? Comment peut-on savoir quel enregistrement de sale correspond à quel enregistrement de ud ? Est-ce basé sur l'id comme clé primaire dans les deux tables ?

0 votes

Comment pouvez-vous mettre à jour UD ? Il n'a que l'assiduité et son propre ID. Pourriez-vous donner un exemple en termes de valeurs réelles qui existent, et les enregistrements que vous voudriez modifier ou ajouter à la suite du script ?

3 votes

2664voto

Eric Points 35647

La syntaxe dépend strictement du SGBD SQL que vous utilisez. Voici quelques façons de procéder en ANSI/ISO (qui devrait fonctionner avec n'importe quel SGBD SQL), MySQL, SQL Server et Oracle. Sachez que la méthode ANSI/ISO que je suggère sera généralement beaucoup plus lente que les deux autres méthodes, mais si vous utilisez un SGBD SQL autre que MySQL, SQL Server ou Oracle, il se peut que ce soit la seule solution (par exemple, si votre SGBD SQL ne prend pas en charge le format MERGE ) :

ANSI/ISO :

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL :

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL Server :

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

PostgreSQL :

update ud
  set assid = s.assid
from sale s 
where ud.id = s.udid;

Notez que la table cible ne doit pas être répétée dans le fichier FROM pour Postgres.

Oracle :

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite :

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

3 votes

Il me semble que le MySQL set assid = s.assid devrait être set u.assid = s.assid .

2 votes

Dans la syntaxe ANSI, qu'est-ce qui se passe si le SELECT après le = renvoie plus d'une ligne ?

2 votes

@ThrowawayAccount3Million Ce serait probablement un échec. D'après l'expérience acquise, ce type d'opération attend une valeur scalaire et déclenchera une erreur si un ensemble de résultats est fourni à la place.

159voto

edosoft Points 7783

Cela devrait fonctionner dans SQL Server :

update ud 
set assid = sale.assid
from sale
where sale.udid = id

106voto

user1154043 Points 197

Postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value

22 votes

La réponse serait plus pratique si elle utilisait les noms de tableaux/colonnes utilisés dans la question. Pourquoi y a-t-il 3 tableaux dans votre réponse ?

54voto

MattH Points 1737

Une approche SQL standard serait

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

Sur SQL Server, vous pouvez utiliser une jointure

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

1 votes

Avec la première, vous ne pouvez pas faire de correspondance sur 2+ colonnes, mais la jointure fonctionne très bien.

6 votes

@makciook : huh ? Tu peux simplement ajouter d'autres conditions dans le WHERE si vous souhaitez établir une correspondance avec des colonnes supplémentaires.

3 votes

Juste un détail... mais je pense que le PO voulait dire sale.udid = ud.id. Et non pas sale.id.

40voto

alfonx Points 1487

PostgreSQL :

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X