我在搜索多个表时遇到问题 ,我有2张桌子
tblcourse
-courseid
-name
-status
tblenroll
-courseid(持有来自tblcourse的课程)
-studentid
让我们说学生有1990年作为学生数,他在tblenrol注册了2门课程
我想得到1990年的课程名称和他未订阅的课程
我最接近的是一个右外连接到tblcourses然后我得到我想要的结果,但是一旦我附上一个where子句它就不会给我剩下没有得到他的学号的课程。
任何帮助!!
编辑(从op发布的答案中添加)
嘿,谢谢你的回复。好吧,我认为我没有正确解释它。tblcourse将举办许多课程 tblenroll拥有许多注册
所以,想象一下我们有6门课程。 1990年学生注册3,学生1880注册1(1990年没注册)
当我们运行时:
WHERE (tblenroll.studentid = 1990 or tblenroll.studentid is null)
或
where e.studentid is null or e.studentid is not null and e.studentid = 1990
它将获得5门课程,3门注册到1990年和2场NULLS。第六个注册到1880年。
此查询会显示正确的结果,但不会针对特定学生
SELECT
tblenroll.studentid as stud,
tblcourse.name,
tblenroll.studentid,
tblenroll.courseid,
tblcourse.courseid,
FROM
tblenroll
Right Join tblcourse ON tblenroll.courseid = tblcourse.courseid
上面我会得到
1880 - 1 1990 - 3 NULL - 2
令人困惑的东西!
答案 0 :(得分:2)
select tblcourse.name, e.studentid
from tblcourse c left join tblenroll e on c.courseid = e.courseid
where e.studentid is null or e.studentid is not null and e.studentid = :id
将导致
course1 1990
course2 NULL
course3 NULL
course4 1990
...
取决于您的数据库,您可以使用一种IIF函数来放置1或0,true或false - 无论是哪个标志作为第二个元素
答案 1 :(得分:0)
你可能只需要让studentid为null,以及你要查询的实际id。
尝试,例如:
SELECT tblenroll.studentid, tblcourse.courseid, tblcourse.name, tblcourse.status
FROM tblenroll RIGHT OUTER JOIN tblcourse ON tblenroll.courseid = tblcourse.courseid
WHERE (tblenroll.studentid = 1990
or tblenroll.studentid is null) -- this allows the courses in which 1990 is not enrolled
编辑:我第一次没有想到这一点。上面的查询是我的naieve方法,并且可能返回与OP 不想要的结果相同的结果。诀窍是在表连接后不使用where子句,而是限制参与连接的tblenroll中的行。
我相信这应该可行(我在SQL Server 2005上使用类似的表/结构对其进行了测试):
SELECT tblenroll.studentid, tblcourse.courseid, tblcourse.name, tblcourse.status
FROM tblenroll RIGHT OUTER JOIN tblcourse ON tblenroll.courseid = tblcourse.courseid
AND tblenroll.studentid = 1990