MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表(两个连接)

Posted

技术标签:

【中文标题】MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表(两个连接)【英文标题】:MySQL Error 1093 - Can't specify target table for update in FROM clause (two joins) 【发布时间】: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);

【问题讨论】:

【参考方案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 数据类型并尽可能多地保存。

以上是关于MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表(两个连接)的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 错误:1093 - 无法在 FROM 子句中指定要更新的目标表

MySQL错误1093 - 无法在FROM子句中指定更新的目标表

MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表(两个连接)

MySQL错误1093 - 无法在FROM子句中指定更新的目标表

MySQL 5.7 错误 (1093: You can't specify target table ___ for update in FROM 子句) - 通常的解决方案不起作用

mysql 1093错误