web-dev-qa-db-fra.com

Instructions de mise à jour et de jointure externe gauche

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

28
Evilaid
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.

53
JonH

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)
7
kleinohad

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 <> '' 
5
Tillito

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.

2

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';
0
Csongor Halmai