【问题标题】:SQL "more than one row returned by a subquery used as an expression" errorSQL“用作表达式的子查询返回多行”错误
【发布时间】:2020-04-02 05:41:36
【问题描述】:

名称 |年级 ------------ 山姆 | 4 山姆 | 5 山姆 | 3 马克 | 1 马克 | 2 约翰 | 3 爱丽丝| 1 爱丽丝| 2

我有这个数据库,我想选择平均成绩高于平均成绩(总体)的人。例如,对于 Sam,它会检查 "(4+5+3)/3 > (4+5+3+1+2+3+1+2)/8" 是否为真,如果是,那么它将返回 Sam。

SELECT * 
FROM grade 
WHERE (SELECT DISTINCT AVG(grade) from grade GROUP BY name) > (SELECT AVG(grade) from grade);

我试过了,但我一直收到错误消息“用作表达式的子查询返回了不止一行”... 我使用 WHERE 语句是否错误?

【问题讨论】:

    标签: sql


    【解决方案1】:

    您收到的错误消息与您脚本的以下部分有关-

    (SELECT DISTINCT AVG(grade) from grade GROUP BY name)
    

    上面的脚本实际上为每个学生返回一行,在您的情况下,它是 4 行,因为总共有 4 个学生。现在,按照正常逻辑,您不能像 (1,23,200) > 'Some Value' 这样的多个值实现 WHERE 子句。

    GROUP BY name 是一个不好的选择,因为多个学生可以有相同的名字。你可以用学生证代替。

    最后,您可以使用 HAVING 代替 WHERE 来尝试以下逻辑。

    SELECT name,AVG(grade)
    FROM grade 
    GROUP BY name
    HAVING AVG(grade) > = (SELECT AVG(grade) from grade)
    

    要获取学生人数,您可以将以下逻辑与子查询一起使用-

    SELECT COUNT(*) FROM
    (
        SELECT name,AVG(grade) average
        FROM grade 
        GROUP BY name
        HAVING AVG(grade) > = (SELECT AVG(grade) from grade)
    )A
    

    【讨论】:

    • 比我快 30 秒。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多