[英]MySQL use function column in where clause?
目前,我对自己的SQL技能有些不满意,并试图在下面的语句中了解如何解决该问题。 我有一个子查询,我必须从中选择,因为通过函数调用生成的列无法在同一查询的WHERE子句中引用。 因此,我必须选择一个子查询,以便可以在WHERE中使用“ BaseValue”。 我的问题是子查询返回的列多于1,这在运行MySQL时导致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();
谢谢。
我将猜测此查询可能有效:
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.*
,您可能会获得所需的所有列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.