SQL子查询返回超过1行

时间:2017-07-19 13:06:34

标签: mysql sql

我需要在此表“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行

4 个答案:

答案 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子查询。根据您的使用情况,您可以将MINMAX添加到子查询中。这里是所有子查询中的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。