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

大连地尔

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

DELIMITER //
CREATE PROCEDURE SellItem(pCharacterName varchar(50), pItemName varchar(50), howManyItems int(11))
BEGIN

DECLARE pchar int(11);
DECLARE pitem int(11);
DECLARE pitemCost int(11);
DECLARE pcharMoney int(11);
DECLARE newMoneyValue int(11);
DECLARE cnt int(11) DEFAULT 1;
DECLARE pcharitid int(11);

SET pchar=(SELECT `getChar`(`pCharacterName`));
SET pitem=(SELECT `getItem`(`pItemName`));
SET pitemCost=(SELECT `price` FROM `item` WHERE `item`.`item_id`=pitem);
SET pcharMoney=(SELECT `money` FROM `character` WHERE `character`.`character_id`=pchar);
SET newMoneyValue=pcharMoney;
WHILE cnt<=`howManyItems` DO
SET newMoneyValue=newMoneyValue+pitemCost;
SET cnt=cnt+1;
END WHILE;
SET cnt=1;

WHILE cnt<=`howManyItems` DO
SET pcharitid=(SELECT MAX(`character_item_id`) FROM `character_item` WHERE `character_item`.`character_id`=pchar AND `character_item`.`item_id`=pitem);
IF (SELECT `item_id` FROM `character_item` WHERE `character_item`.`item_id` IN(SELECT `item_id` FROM `item` WHERE `item`.`name`=`pItemName`)) THEN
DELETE FROM `character_item` WHERE `character_item`.`character_item_id`=pcharitid;
UPDATE `character` SET `money`=newMoneyValue WHERE `character`.`character_id`=pchar;
SET cnt=cnt+1;
END IF;
END WHILE;
END; //
DELIMITER ;

我调用的函数是简单的函数,它们返回所选角色/项目的 ID。

比尔·卡文

当您在只需要一个值的上下文中调用 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()条件。

您可以使用 my usingSELECT MAX(item_id)......LIMIT 1在查询结束时使用来修复它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MySQL的:错误代码:#1242 - 子查询返回多个1行

[21000] [1242]子查询返回多于1行

* SQL错误:错误代码:1242。子查询返回的行数超过1

MYSQL-错误代码:1242。子查询返回的行数超过1

MySQL-(#1242)子查询返回多于1行

错误#1242子查询在更新时返回多于1行

#1242-子查询返回的行数超过1

“子查询返回多于1行”错误

SQL错误(1242):子查询返回的行数超过1

子查询-#1242-子查询返回多于1行

错误代码:1242子查询返回多于1行的mysql

子查询返回超过1行的MySQL

MYSQL-错误:#1242-子查询返回的行数超过1

UPDATE MySQL查询错误“子查询返回多于1行”

我遇到错误-子查询返回的值超过1。我的查询出了什么问题

错误代码:1242。子查询返回的行数超过1-函数

sql 我有错误代码:1242 子查询返回超过 1 行

致命错误:未捕获的异常“异常”,消息为“错误:子查询返回超过 1 行<br />错误号:opencart 中的 1242

IN() 返回“基数违规:1242 子查询返回多于 1 行”

奇怪的 MySQL 错误 #1242 - 子查询返回超过 1 行

MySQL - 从一个表插入到另一个错误代码:1242。子查询返回超过 1 行

SQL 问题:错误代码:1242。子查询返回多于 1 行

SQL 错误 == 1242 (21000):子查询返回多于 1 行

SQL:子查询返回超过 1 行

错误:1242 - 子查询返回超过 1 行

#1242 - 子查询在 mysql phpMyAdmin 中返回超过 1 行

RANK() 在 mysql 中使用,当我使用子查询获取特定等级的行时,抛出“错误代码:1242。子查询返回超过 1 行”

选择子查询错误子查询返回超过 1 行

错误代码:1242。子查询在属性子查询中返回多于 1 行