使用INNER JOIN乘以选定的行?

sta*_*amo 2 sql inner-join

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

我有四个要联接的表,前三个表似乎正确,当我联接第四个表时,联接乘以行(表AB *表C)。

第四张表只有37行,但是根据viewunitsonrun.strUnitCode需要将每一行专门插入几次,并在第一张表中重复几次(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 */
Run Code Online (Sandbox Code Playgroud)

小智 5

由于两个联接都返回多个记录,因此产生笛卡尔乘积。为了先保留结果JOIN,必须确保通过唯一键选择其他联接。如果表没有可供选择的唯一键,则可以使用DISTINCT或进行子查询(INLINE VIEW),GROUP BY以使其按需要工作。

样品:

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'
Run Code Online (Sandbox Code Playgroud)