【问题标题】:MySQL Error 1093 - Can't specify target table for update in FROM clause (two joins)MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表(两个连接)
【发布时间】:2020-06-04 00:17:23
【问题描述】:

我正在尝试使用 sales_orders 中的 applied_discount 字段计算来更新 sales_order_parts 详细信息表中的 unit_price。此外,价格在 master_part_list 表中作为价格。当我从 select 语句向下运行时,它运行良好并返回 order_number 209 中的值列表,计算正确。当我从更新行完整运行它时,它返回“错误代码:1093。您不能在 FROM 子句中指定目标表 'sop' 进行更新”有什么想法吗?

update sales_order_parts as sop
    set unit_price =
    (select (master_part_list.price * (1-(so.applied_discount/100)))
    from sales_orders as so
        inner join sales_order_parts as sop2 
            on so.id = sop2.order_id
        inner join master_part_list 
            on sop2.part_id = master_part_list.id
        where so.order_number = 209);

【问题讨论】:

    标签: mysql mysql-error-1093


    【解决方案1】:

    你可以尝试不带子查询的连接

    update sales_order_parts as sop
    INNER JOIN sales_orders as so on so.id = sop.order_id
      AND so.order_number = 209 
    inner join master_part_list on sop.part_id = master_part_list.id
    SET sop.unit_price = master_part_list.price * (1-(so.applied_discount/100))
    

    【讨论】:

    • 谢谢。这行得通。我不得不设置四舍五入。 SET sop.unit_price2 = round((master_part_list.price * (1-(so.applied_discount/100))),2);
    【解决方案2】:

    对 sales_order_parts 使用子查询。 mysql 然后将其视为新的临时表

    喜欢

    update sales_order_parts as sop
        set unit_price =
        (select (master_part_list.price * (1-(so.applied_discount/100)))
        from sales_orders as so
            inner join (SELECT * FROM sales_order_parts) as sop2 
                on so.id = sop2.order_id
            inner join master_part_list 
                on sop2.part_id = master_part_list.id
            where so.order_number = 209);
    

    【讨论】:

    • mysql 接受了这个代码,但是当我运行完整的代码时,我得到消息“错误代码:1242。子查询返回超过 1 行”
    • 事先运行您的 SELECT 查询,如果您获得多个结果行,请将其限制为一个并对其进行排序以获得想要的结果。
    • 查询返回4行(此订单209有4行项目)。我试图更具体,但仍然得到错误代码 1242。``` update sales_order_parts as sop set unit_price = (select (master_part_list.price * (1-(so.applied_discount/100))) (SELECT * FROM sales_order_parts) as sop2 on so.id = sop2.order_id 内部连接 ​​master_part_list on sop2.part_id = master_part_list.id where so.order_number = 209 and sop2.part_id = master_part_list.id); ```
    • 我希望它能够遍历这 4 行(或不同订单上的尽可能多的行)并使用应用的折扣更新价格。
    • 一个单位在您的查询中只能有一个价格。现在您可以设置最大值或平均值或任何您喜欢的值,但结果必须是 1 值才能放入单价,如果您想获得更多价格,请将列设为 json 数据类型并尽可能多地保存。
    猜你喜欢
    • 2014-07-19
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-08-15
    • 2016-07-03
    • 2014-07-31
    相关资源
    最近更新 更多