繁体   English   中英

更新表,其中列为MIN

[英]Update table where column is MIN

我正在为房屋库存写一个小更新,该更改将更改到期日期最久的产品的数量(我实现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'的目标又作为数据的单独来源

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

如果您在内部查询中引用该表,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
);

希望能帮助到你。

我只使用order bylimit

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

与您的方法相比,这有两个主要优点。 首先,它更简单,不需要任何黑客就可以避免MySQL对引用表的限制。

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

如果您不想采用这种方法(例如,因为您已经在UPDATE)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我也可能会抛出Ilosc > 0的条件。

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);

请尝试以下查询。 并点击此链接( 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM