我需要在此表“Strobjednavka”中设置“dph”,但我不知道那里有什么问题。请帮忙:)。
这是我的SQL脚本:
UPDATE STRObjednavka as o SET dph = (
SELECT dph FROM STRCena WHERE
menuKodCode =
(SELECT menuKodCode FROM STRMenu WHERE
id = o.menuId
)
AND
skupinaId =
(SELECT stravGroupId FROM grups1 WHERE
PKey =
(SELECT SGroup FROM users1 WHERE
PKey = o.userId
)))
WHERE o.price > 0 AND `date` > '2015-01-28 13:52:36' AND dph = 0;
SQL说:SQL错误1242:子查询返回超过1行
答案 0 :(得分:1)
您可以使用以下脚本进行更新,但需要检查更新是否正确,如果您提供一些示例数据,则可以轻松跟踪问题。
UPDATE STRObjednavka as o SET dph = (
SELECT max(dph) FROM STRCena WHERE
menuKodCode =
(SELECT max(menuKodCode) FROM STRMenu WHERE
id = o.menuId
)
AND
skupinaId =
(SELECT max(stravGroupId) FROM grups1 WHERE
PKey =
(SELECT max(SGroup) FROM users1 WHERE
PKey = o.userId
)))
WHERE o.price > 0 AND `date` > '2015-01-28 13:52:36' AND dph = 0;
答案 1 :(得分:1)
不幸的是,MySQL不允许你LIMIT
子查询。根据您的使用情况,您可以将MIN
或MAX
添加到子查询中。这里是所有子查询中的MIN
:
UPDATE STRObjednavka as o SET dph = (
SELECT MIN(dph) FROM STRCena WHERE
menuKodCode =
(SELECT MIN(menuKodCode) FROM STRMenu WHERE
id = o.menuId
)
AND
skupinaId =
(SELECT MIN(stravGroupId) FROM grups1 WHERE
PKey =
(SELECT MIN(SGroup) FROM users1 WHERE
PKey = o.userId
)))
WHERE o.price > 0 AND `date` > '2015-01-28 13:52:36' AND dph = 0;
虽然你真的只需要将它添加到返回多行的子查询中。
答案 2 :(得分:0)
你的第一个问题是你在写'.... =(SELECT ....)'。由于您使用的是等于运算符,因此您要求SQL将整列值分配给单个单元格。在子查询之前将等于运算符更改为IN运算符。
答案 3 :(得分:0)
您可能应该使用不同的查询模式。
在您的查询中,您可以在多个地方使用此类内容。
WHERE menuKodCode = /* !! might generate error 1242 */
(SELECT menuKodCode FROM STRMenu WHERE id = o.menuId)
无法保证您的内部查询不会返回多行,并且当它发生时,MySQL会抛出错误1242.
SQL可以使用多组值。如果您使用IN
代替=
,那么您的查询就可以使用。
WHERE ... menuKodCode IN
(SELECT menuKodCode FROM STRMenu WHERE id = o.menuId)
但你应该弄清楚这种逻辑是否正确。如果我是你,我会做一大堆SELECT操作来测试它,然后再做UPDATE。