我写的家庭库存的小更新,改变数量的产品,其中有最古老的有效期(我的方式,以实现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”被指定两次,既是“更新”的目标,也是单独的数据源。
有人能给我指明正确的方向吗?
发布于 2017-10-15 11:54:54
我只会用order by和limit
UPDATE stan
SET Ilosc = Ilosc - 1
WHERE id_product = 1
ORDER BY Date_exp
LIMIT 1;这与您的方法相比有两个关键的优点。首先,它更简单,不需要任何黑客绕过MySQL对引用正在更新的表的限制。
第二,逻辑是正确的。您的代码可以更新产品id不是1的行,因为在外部查询中没有限制。具有不同产品ids的多个行可以具有相同的最小日期。
如果您不想采用这种方法(比如说,因为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。
发布于 2017-10-15 09:40:49
如果在内部查询中引用表,MySQL不允许对该表执行更新/插入/删除。但是,解决方法是在子查询中使用临时表,如下所示:
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
);希望能帮上忙。
发布于 2017-10-15 09:57:35
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://stackoverflow.com/questions/46753504
复制相似问题