2

有很多关于内部连接的帖子,但不确定它是否完全解决了我的问题?

我有四个我希望加入的表,其中前三个看起来是正确的,当我加入第四个表时,连接会增加行(表 AB * 表 C)。

第 4 个表只有 37 行,但是根据在第 1 个表中重复多次的 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 */
4

1 回答 1

5

它导致笛卡尔积,因为两个连接都返回多个记录。为了在 first 之后保留结果JOIN,您必须确保其他加入是通过唯一键选择的。如果表没有供您选择的唯一键,您可以使用DISTINCTGROUP 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'
于 2012-11-30T18:27:25.660 回答