web-dev-qa-db-ja.com

更新および左外部結合ステートメント

リレーションを持つ2つのテーブルがあり、テーブルAのフィールドを更新します。同じクエリで更新と結合を組み合わせることはできますか?私はそれをグーグルで検索しましたが、実用的なソリューションは見つかりませんでしたか?

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

MS SQLを使用しています

28
Evilaid
Update t 
SET 
       t.Column1=100
FROM 
       myTableA t 
LEFT JOIN 
       myTableB t2 
ON 
       t2.ID=t.ID

myTableAをテーブル名に置き換え、Column1を列名に置き換えます。

この後、単にtableBにLEFT JOINします。この場合のtは、単にmyTableAのエイリアスです。 t2は結合テーブルのエイリアスです。私の例ではmyTableBです。 tまたはt2を使用するのが好きでない場合は、好きなエイリアス名を使用してください-それは問題ではありません-私はたまたまそれらを使用するのが好きです。

53
JonH

必要なものがSELECTステートメントからの更新である場合、次のようなことができます。

UPDATE suppliers    
SET city = (SELECT customers.city FROM customers

WHERE customers.customer_name = suppliers.supplier_name)
7
kleinohad

表1の列の値が表2の列に挿入されるもう1つの例:

UPDATE  Address
SET     Phone1 = sp.Phone
FROM    Address ad LEFT JOIN Speaker sp
ON      sp.AddressID = ad.ID
WHERE   sp.Phone <> '' 
5
Tillito

このクエリの左結合は無意味です。

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

pd_mounting_detailsに一致する行が存在するかどうかにかかわらず、pd_order_ecolidのすべての行を更新します。一致する行のみを更新する場合は、内部結合にする必要があります。

結合の有無に基づいて何らかの条件を適用する場合は、WHERE句にCASE句やSET式を追加する必要があります。

Mysqlでは、SET句を指定する必要がありますafter the JOIN。例:

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