MySQL:更新表中与另一个查询结果匹配的所有行

MySQL:更新表中与另一个查询结果匹配的所有行,mysql,sql,sql-update,Mysql,Sql,Sql Update,我编写了一个查询,返回关联客户和销售人员的行 请注意,该查询连接了多个数据库表。请注意,并非所有客户都有销售人员 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

我编写了一个查询,返回关联客户和销售人员的行

请注意,该查询连接了多个数据库表。请注意,并非所有客户都有销售人员

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(存在这种关系的地方)

请注意,如果存在客户/销售人员关系,则该客户的所有发票都应该有与其关联的销售人员(如果该客户有销售人员)


非常感谢:-

假设您的第一张表是命名客户,并且没有销售人员的客户的s_id为空

我建议在开发中进行测试,或者首先使用上面的连接运行SELECT查询,以确保结果。

使用子查询 最受广泛支持的选项

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)
使用连接
您可以创建一个视图来简化UPDATE语句。该视图应该包含您的查询(在您的案例中),即关联客户和销售人员的查询。然后在您的案例中更新表格发票,如下所示:

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

连接选项绝对漂亮。非常感谢:只是需要用精选的废话来取代客户和销售。真是一个很好的例子。尤其是使用JOIN.not working for 11g ORA-00971的第二个示例:not working for 11g ORA-00971:
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
update TableToUpdate ttu, MyView mv
set ttu.column = mv.column
where ttu.key = mv.key