列为MIN的更新表

时间:2017-10-15 09:17:30

标签: mysql sql

我正在为家庭库存编写小更新,这会更改具有最早到期日期的产品的数量(我实现FIFO的方式)。下面是我试图执行但没有运气的例子。

UPDATE stan
SET Ilosc=Ilosc-1
WHERE Date_exp=(SELECT MIN(Date_exp) AS Date_exp FROM stan as sta WHERE ID_Product=1)

以上示例以以下错误结束:

  

1093 - 表'stan'被指定两次,既作为'UPDATE'的目标又作为数据的单独来源

有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:1)

如果您在内部查询中引用该表,则MySQL不允许您对表执行UPDATE / INSERT / DELETE。但是,解决方法是在子查询中使用临时表,如下所示:

UPDATE stan a
SET a.Ilosc=a.Ilosc-1
WHERE a.Date_exp =
(SELECT Date_exp from 
     (select min(date_exp) as date_exp 
      FROM stan 
      WHERE ID_Product=1) sta
);

希望它有所帮助。

答案 1 :(得分:0)

我会使用order bylimit

UPDATE stan
    SET Ilosc = Ilosc - 1
    WHERE id_product = 1
    ORDER BY Date_exp
    LIMIT 1;

与您的方法相比,这有两个关键优势。首先,它更简单,并且不需要任何黑客来解决MySQL引用正在更新的表的限制。

其次,逻辑是正确的。您的代码可以更新产品ID不为1的行,因为您在外部查询中没有限制。具有不同产品ID的多行可以具有相同的最小日期。

如果你不想采用这种方法(比如因为JOIN中已经有UPDATE),你可以这样做:

UPDATE stan s JOIN
       (SELECT id_product, MIN(Date_exp) as minde
        FROM stan s2
        WHERE id_product = 1
        GROUP BY id_product
       ) s2
       ON s.id_product = s2.id_product AND s.Date_exp = s2.minde
    SET Ilosc = Ilosc - 1;

如果你有意,我也可能会Ilosc > 0

答案 2 :(得分:-1)

UPDATE A
SET A.COLUMN_NAME=VALUE
FROM TABLE_NAME A
INNER JOIN (SELECT MIN(COLUNN_NAME) FROM TABLE_NAME)  B ON (A.COLUMN_NAME=B.COLUMN_NAME);

答案 3 :(得分:-1)

尝试以下查询。并点击此链接(https://dev.mysql.com/doc/refman/5.6/en/update.html

UPDATE stan
SET Ilosc=Ilosc-1
WHERE Date_exp=(SELECT Date_exp FROM (SELECT MIN(Date_exp) AS Date_exp FROM `stan` AS sta WHERE ID_Product = 1) AS t)