MySQL在where子句中使用函数列?

时间:2015-12-16 21:40:43

标签: mysql sql

我目前的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();

感谢。

1 个答案:

答案 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.*,您可能会获得所需的所有列。