内部联接上有很多帖子,但不确定是否能完全解决我的问题?
我有四个要联接的表,前三个表似乎正确,当我联接第四个表时,联接乘以行(表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)