清风难入凡尘 2025-08-23 16:09 采纳率: 0%
浏览 5

求解答,不知道这么解决

为什么这个sql会报错

--3.1.3 查询出只选修了三门课程的全部学生的学号和姓名
select student_info.stu_id ,student_info.stu_name 
from student_info
where student_info.stu_id in (
    select score_info.stu_id
    from score_info
    group by score_info.stu_id 
    HAVING COUNT(distinct score_info.course_id) = 3
);

报错:

img

score_info表是有那个列的

create table if not exists score_info(
    stu_id string COMMENT '学生id',
    course_id string COMMENT '课程id',
    score int COMMENT '成绩'
)
row format delimited fields terminated by ','
stored as textfile;


之前没有指明表的时候也是这样的报错,指明了依然这样,实在是没办法了

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-08-23 16:20
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提供的 SQL 语句看起来是想查询只选修了三门课程的学生的学号和姓名。然而,你遇到了报错问题,虽然你已经指明了表名,但仍然出现了错误。


    🔍 问题分析

    1. 报错信息缺失

    你没有提供具体的错误信息(例如:column not foundsyntax error),这会增加排查难度。不过根据你的描述,可以推测可能是以下几种情况:

    • 列名不匹配:可能在子查询中引用了不存在的字段。
    • 语法错误:比如缺少关键字、括号不匹配等。
    • Hive 特性限制:如果你使用的是 Hive 而不是 MySQL,某些语法可能不支持。

    ✅ 正确的 SQL 应该是这样的:

    SELECT si.stu_id, si.stu_name
    FROM student_info si
    WHERE si.stu_id IN (
        SELECT sc.stu_id
        FROM score_info sc
        GROUP BY sc.stu_id
        HAVING COUNT(DISTINCT sc.course_id) = 3
    );
    

    重点说明:

    • COUNT(DISTINCT course_id) 是正确的写法,确保统计的是不同的课程数量
    • 表别名(如 sisc)让查询更清晰,避免歧义。
    • IN 子句 中的子查询返回的是选修了三门课程的学生 ID。

    🛠️ 可能的错误原因及解决方法

    ❗ 错误原因 1:列名拼写错误

    示例错误:

    select score_info.stu_id from score_info group by score_info.stu_id having count(distinct score_info.courses_id) = 3
    

    注意: courses_id 拼写错误,应该是 course_id

    解决方案:

    检查所有字段名是否与建表语句一致:

    CREATE TABLE IF NOT EXISTS score_info(
        stu_id STRING COMMENT '学生id',
        course_id STRING COMMENT '课程id',
        score INT COMMENT '成绩'
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS TEXTFILE;
    

    确保在 SQL 中使用 course_id 而不是其他拼写


    ❗ 错误原因 2:未正确使用 DISTINCT

    如果只是用 COUNT(course_id),可能会重复计数同一学生的同一课程多次。

    示例错误:

    HAVING COUNT(course_id) = 3
    

    解决方案:

    使用 COUNT(DISTINCT course_id) 来保证只统计不同课程的数量。


    ❗ 错误原因 3:Hive 不支持 IN 子查询(取决于版本)

    部分旧版 Hive 不支持 IN 子查询,或者性能较差。

    替代方案:使用 JOIN

    SELECT si.stu_id, si.stu_name
    FROM student_info si
    JOIN (
        SELECT sc.stu_id
        FROM score_info sc
        GROUP BY sc.stu_id
        HAVING COUNT(DISTINCT sc.course_id) = 3
    ) tmp
    ON si.stu_id = tmp.stu_id;
    

    重点说明:

    • 使用 JOIN 替代 IN 子查询,提高兼容性和性能。

    📌 总结

    ✅ 推荐的 SQL 写法如下:

    SELECT si.stu_id, si.stu_name
    FROM student_info si
    WHERE si.stu_id IN (
        SELECT sc.stu_id
        FROM score_info sc
        GROUP BY sc.stu_id
        HAVING COUNT(DISTINCT sc.course_id) = 3
    );
    

    或使用 JOIN 方式:

    SELECT si.stu_id, si.stu_name
    FROM student_info si
    JOIN (
        SELECT sc.stu_id
        FROM score_info sc
        GROUP BY sc.stu_id
        HAVING COUNT(DISTINCT sc.course_id) = 3
    ) tmp
    ON si.stu_id = tmp.stu_id;
    

    🧪 验证建议

    你可以先单独运行子查询,看是否能正常返回结果:

    SELECT sc.stu_id
    FROM score_info sc
    GROUP BY sc.stu_id
    HAVING COUNT(DISTINCT sc.course_id) = 3;
    

    如果这个子查询能正常执行并返回学生 ID,那么主查询就应该是正确的。


    如有更多错误信息,请提供完整的错误提示,我可以进一步帮助你定位问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月23日
  • 创建了问题 8月23日