首页 > 解决方案 > 表在程序中指定了两次,如何解决?

问题描述

尝试运行程序时收到此消息:

在此处输入图像描述

程序是:

BEGIN

DECLARE v_user_id INT DEFAULT 0;
DECLARE v_order_id INT DEFAULT 0;
DECLARE v_min_price INT DEFAULT 0;

UPDATE `ordersperformers` SET `ordersperformers`.`Status` = 1

WHERE EXISTS (
SELECT 
@v_min_price = MIN(`ordersperformers`.`DeliveryPrice` + `ordersperformers`.`Price`), @v_user_id = `ordersperformers`.`Users_Id` = @v_user_id,
@v_order_id =`ordersperformers`.`Orders_Id`

    FROM `ordersperformers`

INNER JOIN
`orders` ON `orders`.`Id` = `ordersperformers`.`Orders_Id` WHERE
NOW() <= DATE_SUB(`orders`.`DeliveryDate`, INTERVAL 2 HOUR) AND `orders`.`Status` = 0 AND `ordersperformers`.`Status` = 0
) AND `ordersperformers`.`Orders_Id` = @v_order_id AND `ordersperformers`.`Users_Id` = @v_user_id;
END

如何解决?

标签: mysqlsql

解决方案


我认为你想要一个相关的子查询:

UPDATE ordersperformers op
    SET op.Status = 1    
WHERE op.Status = 0 AND
      op.Orders_Id = @v_order_id AND
      op.Users_Id = @v_user_id AND
      EXISTS (SELECT  1
              FROM orders o
              WHERE o.id = op.Orders_Id AND
                    NOW() <= DATE_SUB(o.DeliveryDate, INTERVAL 2 HOUR) AND
                    o.Status = 0 
             );

我改变/修复了一堆其他的东西:

  • 表别名使查询更易于编写和阅读。
  • 反引号使查询更难写和读。
  • 只有在被更新的表上的条件应该在外部WHERE,而不是内部WHERE
  • 在子查询中设置变量EXISTS根本没有意义。 EXISTS测试是否存在。从逻辑上讲,它可以在不评估SELECT.

推荐阅读