【问题标题】:MySQL: how to UPDATE query based on SELECT QueryMySQL:如何基于 SELECT Query UPDATE 查询
【发布时间】:2020-04-04 19:15:30
【问题描述】:

我有以下 SQL 查询,它在 MySQL 服务器上进行批量更新:

UPDATE res_booking AS rbg
SET rbg.host_id = (
    SELECT vw.entity_id FROM res_booking AS rb
    INNER JOIN pass_single as ps ON (ps.book_id = rb.booking_id)
    INNER JOIN voucher_who as vw ON (vw.pass_id = ps.pass_id)
    WHERE rb.booking_id = rbg.booking_id
)
WHERE rbg.host_id IS NULL;

执行它,给我以下错误:

错误代码:1093。您不能在 FROM 子句中指定目标表 'rbg' 进行更新

如何重写这个查询,让它工作?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    我会把它写成一个更新连接:

    UPDATE res_booking AS rbg
    INNER JOIN res_booking AS rb
        ON rb.booking_id = rbg.booking_id
    INNER JOIN pass_single AS ps
        ON ps.book_id = rb.booking_id
    INNER JOIN voucher_who AS vw
        ON vw.pass_id = ps.pass_id
    SET
        rbg.host_id = vw.entity_id
    WHERE
        rbg.host_id IS NULL;
    

    从技术上讲,res_booking 上的自联接应该是左联接,因为无论子查询是否返回值,您当前的更新总是会分配给每条记录。但是,我怀疑内部连接逻辑是您真正想要的。

    【讨论】:

      【解决方案2】:

      您可以使用相关子查询。只需将res_booking 留在子查询之外:

      UPDATE res_booking rbg
          SET rbg.host_id = (SELECT vw.entity_id
                             FROM pass_single ps JOIN
                                  voucher_who vw
                                  ON vw.pass_id = ps.pass_id
                             WHERE ps.book_id = rbg.booking_id
                            )
          WHERE rbg.host_id IS NULL;
      

      如果您在子查询中重新使用正在更新的表,MySQL 会生成错误。但是,它不是必需的。只需修复相关子句以使用ps 表即可。

      请注意,如果子查询返回多行,这可能会返回错误。这是一件好事。如果发生这种情况,您将需要弄清楚如何处理这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        相关资源
        最近更新 更多