我有三张表tblCourse
,tblDegree
,tblStudent
。我创建了一个课程和学位关系表,如tblCourseDegreeRelation
。该关系表使用课程和学位表的外键如下:
我需要使用此查询获取所有记录,包括tblStudent
所有记录:
SELECT * from tbldegree d
INNER JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
INNER JOIN tblcourse c ON cdr.c_id = c.c_id
INNER JOIN tblstudent s ON d.d_id = s.d_id
ORDER BY cdr.cdr_id DESC
但这只会返回一个学生的记录,而我在数据库中的两个学生看到SQLFiddle:
如何从联接查询中获取所有学生记录?
任何帮助都将非常感谢!
答案 0 :(得分:1)
在您的情况下,您拥有所有内部联接,因此它将返回两个/所有表满足其条件的结果(on子句)。
查看您的学生数据1 => Ali与学位1 => BS信息技术有关系。 进一步的1级课程(1 =>编程,2 =>英语,5 =>数学,6 =>电子学)
因此,对于学生1,您的内部连接子句可以工作,因为它在所有连接表中都有数据。
现在,如果我们找你的学生3 =>与程度3 =>有关系的Bilal学士学位,但是这个学位没有指定的课程,这就是为什么你的学生Bilal没有回来
要让所有学生无论相关学位都有课程,您都可以将内连接转为左连接而不是所有桌子,但适用于tblcoursedegreerelation
和tblcourse
SELECT *
FROM tblstudent s
INNER JOIN tbldegree d ON d.d_id = s.d_id
LEFT JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
LEFT JOIN tblcourse c ON cdr.c_id = c.c_id
ORDER BY cdr.cdr_id DESC
在结果集中,由于与课程无关,您可以将以下列视为null
cdr_id,c_id,d_id,c_id,c_name,c_credit
答案 1 :(得分:-1)
在tblstudent
上做一次正确的加入:
SELECT * from tbldegree d
INNER JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
INNER JOIN tblcourse c ON cdr.c_id = c.c_id
RIGHT JOIN tblstudent s ON d.d_id = s.d_id
ORDER BY cdr.cdr_id DESC
修改强> 这种方式更好:
SELECT c.d_id,c.d_name,c.d_fee,cdr.cdr_id,cdr_c_id,deg.c_name,deg.d_credit,a.s_id,a.s_name
FROM tblstudent a
left join tblDegree c ON a.d_id = c.d_id
left join tblcoursedegreerelation cdr ON cdr.d_id=c.d_id
left join tblcourse deg on deg.c_id=cdr.c_id
ORDER BY cdr.cdr_id DESC