使用INNER JOIN将所选行相乘?

时间:2012-11-30 18:08:10

标签: sql inner-join

内部联接上有很多帖子,但不确定它是否能解决我的问题?

我希望加入四个表,其中前三个似乎是正确的,当我加入第四个表时,连接乘以行(表AB *表C)。

第4个表只有37行,但根据viewunitsonrun.strUnitCode,每行需要多次专门插入,在第1个表中重复多次(tblawardedlearers)。

SELECT viewlearnersonrun.intRunID,
       intlearnerID,
       strFirstname, 
       strunitcode, 
       strGrade
  FROM tblawardedlearners
 INNER JOIN viewlearnersonrun
         ON viewlearnersonrun.intID = tblawardedlearners.intLearnerID
 INNER JOIN viewrun
         ON viewrun.intID = viewlearnersonrun.intRunID /*CORRECT TO THIS POINT */
 INNER JOIN viewunitsonrun
         ON viewunitsonrun.strUnitCode = tblawardedlearners.strUnitCode 
 WHERE viewlearnersonrun.intRunID = '200GE2'   /* display only one Course */

1 个答案:

答案 0 :(得分:4)

它产生笛卡尔积,因为两个连接都返回多个记录。为了在第一个JOIN之后保留结果,您必须确保通过唯一键选择其他加入。如果表格没有您选择的唯一键,您可以使用DISTINCTGROUP BY进行子查询(INLINE VIEW),使其按您想要的方式工作。

样品:

SELECT viewlearnersonrun.intRunID,
       intlearnerID,
       strFirstname,
       strunitcode,
       strGrade
  FROM tblawardedlearners 
 INNER JOIN viewlearnersonrun
         ON viewlearnersonrun.intID = tblawardedlearners.intLearnerID
 INNER JOIN viewrun
         ON viewrun.intID = viewlearnersonrun.intRunID 
 INNER JOIN (SELECT DISTINCT strUnitCode --, others columns...
               FROM viewunitsonrun
            ) v
         ON  v.strUnitCode = tblawardedlearners.strUnitCode
 WHERE viewlearnersonrun.intRunID = '200GE2'