我目前的SQL技能有点生疏,并试图了解我如何在以下声明中解决问题。我有一个子查询,我必须选择,因为通过函数调用生成的列不能在同一查询的WHERE子句中引用。所以我必须选择一个子查询,以便" BaseValue"可以在WHERE中使用。我的问题是子查询返回多于1列,这在我运行它时会导致MySQL出错。
错误消息是:
"错误代码:1241。操作数应包含1列。"
这是在INSERT INTO语句下的第二个SELECT语句周围发生的。
有人可以建议我如何最有效地克服这个问题吗?有问题的代码:
CREATE TEMPORARY TABLE tSquads (
Id INT(11) NOT NULL AUTO_INCREMENT,
SquadId INT(11),
SquadBaseValue INT(11),
SquadName VARCHAR(50),
PRIMARY KEY (ID)
) ENGINE=MEMORY;
INSERT INTO tSquads (SquadId, SquadBaseValue, SquadName)
SELECT (temp.Id, temp.BaseValue, temp.Name) FROM (
SELECT
Id,
f_GetSquadAverageBaseValue(Id) AS BaseValue,
Name
FROM
squads
) temp
WHERE
Id <> pSquadId
AND BaseValue BETWEEN vLowestAttackingBaseRate AND vHighestAttackingBaseRate
AND BaseValue > 0
AND ((vPercentageOfBaseRate / 100) * BaseValue) + BaseValue > vCurrentSquadBaseRate
ORDER BY
RAND();
感谢。
答案 0 :(得分:1)
我猜这个查询可能有效:
INSERT INTO tSquads (SquadId, SquadBaseValue, SquadName)
SELECT temp.Id, temp.BaseValue, temp.Name
FROM (SELECT s.*, f_GetSquadAverageBaseValue(Id) AS BaseValue
FROM squads s
) temp
WHERE Id <> pSquadId AND
BaseValue BETWEEN vLowestAttackingBaseRate AND vHighestAttackingBaseRate AND
BaseValue > 0 AND
((vPercentageOfBaseRate / 100) * BaseValue) + BaseValue > vCurrentSquadBaseRate
ORDER BY RAND();
您的WHERE
子句引用了子查询未提供的许多列。使用s.*
,您可能会获得所需的所有列。