【问题标题】:MySQL: Update all rows in a table matching results of another queryMySQL:更新表中匹配另一个查询结果的所有行
【发布时间】:2011-04-14 03:52:42
【问题描述】:

我编写了一个查询,返回与 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

我的数据库中还有一个表(称为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,如果存在这种关系?

请注意,如果存在客户/销售员关系,则该客户的所有发票都应有销售员与之关联,前提是该客户有销售员。

非常感谢 :-)

【问题讨论】:

    标签: mysql sql sql-update


    【解决方案1】:

    使用子查询

    最广泛支持的选项

    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
    

    【讨论】:

    • 连接选项非常漂亮。非常感谢 :) 只需将“CUSTOMERS_AND_SALES”替换为“(SELECT blah from blah blah blah)”。
    • 非常好的例子。尤其是第二个使用 JOIN 的例子。
    【解决方案2】:

    假设您的第一个表名为 customers,而那些没有销售人员的客户的 s_idNULL

    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;
    

    我建议先在开发中测试或使用上面的JOIN 运行SELECT 查询以确保结果。

    【讨论】:

    • 不适用于 11g ORA-00971:كلمة الأساس SET مفقودة
    【解决方案3】:

    您可以创建一个视图来简化您的UPDATE 语句。该视图应包含您的查询(在您的情况下是关联客户和销售人员的查询)。然后像这样更新您的表格(在您的情况下为invoices):

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

    【讨论】:

    • 不适用于 11g ORA-00971:كلمة الأساس SET مفقودة
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多