我正在为家庭库存编写小更新,这会更改具有最早到期日期的产品的数量(我实现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'的目标又作为数据的单独来源
有人能指出我正确的方向吗?
答案 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 by
和limit
:
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)