[英]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 by
和limit
:
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.