3表联接SQL大查询

时间:2018-06-20 15:47:54

标签: google-bigquery

我是SQL联接的新手,所以请耐心等待,我要做的是按每位学生每周加总的方式列出学生的考试成绩。我的查询是

SELECT
  agg.Week,
  meta.Category,
  agg.Student,
  meta.Funding,
  agg.Test_Results,
  agg.Test_Points,
  phy.Test_Results,
  phy.Test_Points
FROM Agriculture agg

INNER JOIN metadata meta
 ON meta.Student_ID = agg.Student_ID

INNER JOIN Physics phy
 ON phy.Student_ID = agg.Student_ID

WHERE agg.Week BETWEEN '1' AND '5'

在我看来,这是正确的,但是由于某种原因,Test_Results和Test_Points会不断重复自身,因此我不确定如何解决。我的意思是重复,因为每个星期的分数都是120,所以一个学生(9)的得分为95,那95将一次又一次地重复给同一个学生。我不确定是否需要将子查询添加到INNER JOINS。

表为:

元数据->(类别,资金,学生ID)(一对多比较表)

物理->(测试结果,测试点,学生ID)(很多)

农业->(周,学生,Test_Results,Test_Points,Student_ID)(多对多)

再次,我是新加入会员,因此如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

您通过使用Student_ID加入表。如果来自农业的同一Student_ID的元数据中有多个对应行,则结果集将显示重复项。 表物理也是如此。

例如:在农业表中有一个Student_ID的行有10行,在具有相同Student_ID的元数据中有2行,如果您加入这些表,您将获得20行。

您确实可以使用子查询来减少元数据和物理中每个Studen_ID的行数,并加入这些子选择。

答案 1 :(得分:0)

您只需将DISTINCT关键字用于agg.Student。