错误1242:子查询返回超过1行 - 为什么?

时间:2017-09-01 15:54:53

标签: mysql

我正在制作销售我的物品的程序。当我尝试调用它时,它会告诉我错误消息。我检查了哪一部分返回更多行,但我无法弄明白。以下是该过程的代码:

np.ones

我调用的函数是简单的函数,它返回所选字符/项的ID。

2 个答案:

答案 0 :(得分:1)

当您在只需要一个值的上下文中调用SELECT,但SELECT在逻辑上不保证只返回一个值时,则会出现此错误。

您有六个SELECT操作:

SET pchar=(SELECT `getChar`(`pCharacterName`));
SET pitem=(SELECT `getItem`(`pItemName`));

这两个是在标量参数上调用存储函数。它们没问题,因为在这两种情况下,它只能返回一个值。

SET pitemCost=(SELECT `price` FROM `item` WHERE `item`.`item_id`=pitem);

这个SELECT可能没关系。我假设item.item_id是该表的主键,因此它只能匹配一行(或零行)。

SET pcharMoney=(SELECT `money` FROM `character` WHERE `character`.`character_id`=pchar);

同样,假设character.character_id是主键,这似乎没问题。

SET pcharitid=(SELECT MAX(`character_item_id`) FROM `character_item` WHERE `character_item`.`character_id`=pchar AND `character_item`.`item_id`=pitem);

这肯定只会返回一个值,因为您使用的是MAX(),而查询中没有GROUP BY

IF (SELECT `item_id` FROM `character_item` WHERE `character_item`.`item_id` IN
    (SELECT `item_id` FROM `item` WHERE `item`.`name`=`pItemName`)) THEN

内部子查询不需要是标量,因为它是IN()谓词的一部分,可以与多个值进行比较。

外部查询必须是标量查询,但事实并非如此。根据您的数据,可以匹配多行,因此无法在IF()条件下进行逻辑使用。

您可以使用SELECT MAX(item_id)...或在查询结尾处使用...LIMIT 1来解决此问题。

答案 1 :(得分:0)

您将必须使用您正在使用的测试数据单独运行每个函数,以确定哪一个函数返回多行。

E.g。首先运行这个:

SELECT 'getChar' ('pCharacterName')

但显然用您的测试数据替换了pCharacterName。