Sql 我的问题哪里出了问题?

Sql 我的问题哪里出了问题?,sql,join,Sql,Join,您的查询似乎在告诉您 有755名学生与另一名同名学生(第一次查询)参加同一课程,以及 788名与另一名学生同名的学生至少选修了一门课程,但至少有一名其他同名学生没有选修(第二个查询) 这些结果并非天生不一致。SQL只是结构化查询语言—许多数据库系统都使用这种语言,但不是数据库产品。。。很多东西都是特定于供应商的-因此我们确实需要知道您使用的是什么数据库系统(以及哪个版本)(请相应地更新标记)…第二个查询更具包容性,因为您不需要匹配课程id,因此任何两个同名的学生都将返回,除非他们都只有一个班级。

您的查询似乎在告诉您

  • 有755名学生与另一名同名学生(第一次查询)参加同一课程,以及
  • 788名与另一名学生同名的学生至少选修了一门课程,但至少有一名其他同名学生没有选修(第二个查询)

  • 这些结果并非天生不一致。

    SQL只是结构化查询语言—许多数据库系统都使用这种语言,但不是数据库产品。。。很多东西都是特定于供应商的-因此我们确实需要知道您使用的是什么数据库系统(以及哪个版本)(请相应地更新标记)…第二个查询更具包容性,因为您不需要匹配
    课程id
    ,因此任何两个同名的学生都将返回,除非他们都只有一个班级。@GoatCO,第二个查询的包容性不强;只是不同而已。如果学生参加的每一堂课都被同名的所有其他学生参加(尽管这可能不太可能),它将错过第一次查询返回的学生。@JohnBollinger它返回更多记录,因此它更具包容性。你说得对,可能是多个课程,只要学生都出现在所有课程中,从数据来看,情况显然不是这样,因为根据OP@GoatCO,788是同名学生的总数,根据数据,第二个查询可以忽略第一个查询返回的记录。若对特定的数据集并没有这样做,那个么这是数据的函数,而不是查询的函数。正是在这个意义上,我声称第二个查询本身并不比第一个查询“更具包容性”。我认为您误读了第二个查询,设置为不匹配的是
    课程id
    ,因此788名学生与另一名学生同名,至少有一门不同的课程。@GoatCO您是对的,我略过一点。更正。
    with StudentTakes (name, id, course_id) as (
        select name, student.id, course_id
        from takes join student on takes.id = student.id
    )
    select distinct name, id 
    from StudentTakes a
    where a.name in (
        select b.name 
        from StudentTakes b
        where b.name = a.name and b.id <> a.id and a.course_id = b.course_id
    )
    order by name;
    
    with StudentTakes (name, id, course_id) as (
        select name, student.id, course_id
        from takes join student on takes.id = student.id
    )
    select distinct name, id 
    from StudentTakes a
    where a.name in (
        select b.name 
        from StudentTakes b
        where b.name = a.name and b.id <> a.id and a.course_id <> b.course_id -- CHANGE
    )
    order by name;