J'ai deux tableaux avec une relation et je souhaite mettre à jour un champ dans le tableau A. Est-il possible de combiner la mise à jour et la jointure dans la même requête? Je l'ai googlé mais je n'ai trouvé aucune solution de travail?
UPDATE md SET md.status = '3'
FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_ecolid AS oe ON md.order_data = oe.id
J'utilise MS SQL
Update t
SET
t.Column1=100
FROM
myTableA t
LEFT JOIN
myTableB t2
ON
t2.ID=t.ID
Remplacez myTableA
par le nom de votre table et remplacez Column1
avec le nom de votre colonne.
Après cela, simplement GAUCHE JOIN à tableB. t
dans ce cas n'est qu'un alias pour myTableA
. t2
est un alias pour votre table jointe, dans mon exemple, c'est myTableB
. Si vous n'aimez pas utiliser t
ou t2
utilisez le nom d'alias que vous préférez - cela n'a pas d'importance - j'aime juste les utiliser.
Si vous avez besoin d'une instruction UPDATE from SELECT, vous pouvez faire quelque chose comme ceci:
UPDATE suppliers
SET city = (SELECT customers.city FROM customers
WHERE customers.customer_name = suppliers.supplier_name)
Juste un autre exemple où la valeur d'une colonne du tableau 1 est insérée dans une colonne du tableau 2:
UPDATE Address
SET Phone1 = sp.Phone
FROM Address ad LEFT JOIN Speaker sp
ON sp.AddressID = ad.ID
WHERE sp.Phone <> ''
La jointure gauche dans cette requête est inutile:
UPDATE md SET md.status = '3'
FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_ecolid AS oe ON md.order_data = oe.id
Il mettrait à jour toutes les lignes de pd_mounting_details
, qu'il existe ou non une ligne correspondante dans pd_order_ecolid
. Si vous souhaitez uniquement mettre à jour les lignes correspondantes, il doit s'agir d'une jointure interne.
Si vous souhaitez appliquer une condition basée sur la jointure ou non, vous devez ajouter une clause WHERE
et/ou une expression CASE
dans votre clause SET
.
Dans mysql, la clause SET
doit venir après la JOIN
. Exemple:
UPDATE e
LEFT JOIN a ON a.id = e.aid
SET e.id = 2
WHERE
e.type = 'user' AND
a.country = 'US';