MySQL:更新表中与其他查询的结果匹配的所有行

Tom*_*ell 16 mysql sql sql-update

我写了一个查询返回关联Customers和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
Run Code Online (Sandbox Code Playgroud)

我的数据库中也有一个表(称为发票),如下所示.

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
Run Code Online (Sandbox Code Playgroud)

如何在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
Run Code Online (Sandbox Code Playgroud)

也就是说,如何更新我的发票表以包含正确的salesperson_id和salesperson_name,该关系存在于何处?

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

谢天谢地:-)

OMG*_*ies 35

使用子查询

最广泛支持的选项

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)
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

  • 连接选项非常漂亮.非常感谢:)只需要将"CUSTOMERS_AND_SALES"替换为"(从blah blah blah中选择等等)". (3认同)