web-dev-qa-db-ja.com

MySQL:別のクエリの結果に一致するテーブルのすべての行を更新します

Customers and Salespeoepleに関連付けられた行を返すクエリを作成しました。

クエリは複数のデータベーステーブルを結合することに注意してください。また、すべての顧客に営業担当者がいるわけではないことに注意してください。

c_id     c_name   s_id   s_name
  24  Microsoft      1     mike
  27        Sun      1     mike
  42      Apple      2     bill
  44     Oracle      1     mike
  47        sgi      1     mike
  58       ebay      2     bill
  61     Paypal      3      joe
  65     redhat      1     mike

また、データベースには次のような単一のテーブル(invoicesと呼ばれます)があります。

i_id   c_id   c_name   s_id   s_name
7208     22   toyota   NULL     NULL
7209     23     ford   NULL     NULL
7210     27      Sun   NULL     NULL
7211     42    Apple   NULL     NULL
7212     12   nissan   NULL     NULL
7213     15       gm   NULL     NULL
7214     61   Paypal   NULL     NULL

MySQLでUPDATEを使用して、請求書テーブルを次のテーブルのようにするにはどうすればよいですか?

i_id   c_id   c_name   s_id   s_name
7208     22   toyota   NULL     NULL
7209     23     ford   NULL     NULL
7210     27      Sun      1     mike
7211     42    Apple      2     bill
7212     12   nissan   NULL     NULL
7213     15       gm   NULL     NULL
7214     61   Paypal      3      joe

つまり、請求書テーブルを更新して、その関係が存在する正しいsalesperson_idとsalesperson_nameを含めるにはどうすればよいですか?

顧客/営業担当者の関係が存在する場合、その顧客の営業担当者がいる場合は、その顧客のすべての請求書に営業担当者を関連付ける必要があることに注意してください。

親切にありがとう:-)

16
Tommy O'Dell

サブクエリの使用

最も広くサポートされているオプション

UPDATE INVOICES
   SET s_id = (SELECT cs.s_id
                 FROM CUSTOMERS_AND_SALES cs
                WHERE cs.c_id = INVOICES.c_id),
       s_name = (SELECT cs.s_name
                   FROM CUSTOMERS_AND_SALES cs
                  WHERE cs.c_id = INVOICES.c_id)
 WHERE INVOICES.c_id IN (SELECT cs.s_id
                           FROM CUSTOMERS_AND_SALES cs)

JOINの使用

UPDATE INVOICES
  JOIN CUSTOMERS_AND_SALES cs ON cs.c_id = INVOICES.c_id
   SET s_id = cs.s_id,
       s_name = cs.s_name
35
OMG Ponies

最初のテーブルの名前がcustomersで、営業担当者がいない顧客にはs_id of NULL

UPDATE invoices JOIN customers USING (c_id)
SET invoices.s_id = customers.s_id, invoices.s_name = customers.s_name
WHERE customers.s_id IS NOT NULL;

開発でテストするか、最初に上記のSELECTを使用してJOINクエリを実行し、結果を確認することをお勧めします。

2
Jason McCreary

ビューを作成して、UPDATEステートメントを単純にすることができます。ビューにはクエリ(この場合、顧客と営業担当者を関連付けるクエリ)が含まれている必要があります。次に、次のようにテーブル(この場合はinvoices)を更新します。

update TableToUpdate ttu, MyView mv
set ttu.column = mv.column
where ttu.key = mv.key
0
Gruber