你如何搜索右/左连接?

时间:2009-08-04 17:22:07

标签: sql join

我在搜索多个表时遇到问题 ,我有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

令人困惑的东西!

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