当前位置:  开发笔记 > 编程语言 > 正文

SQL Join的问题

如何解决《SQLJoin的问题》经验,为你挑选了1个好方法。

我有两个表,tblEntities和tblScheduling.

tblEntities:

EntityID  ShortName          Active
1         Dirtville          1
2         Goldtown           1
3         Blackston          0
4         Cornfelt           1
5         Vick               1

tblScheduling:

ScheduleID EntityID SchedulingYearID
1          1        20
2          1        21
3          2        20
4          3        19
5          5        20

我需要一个查询,它将显示特定ScheduleYearID的所有活动实体及其日程安排信息.

输出应该看起来像(在这种情况下所需的SchedulingYearID是20):

EntityID ScheduleID
1        1
2        3
4        NULL
5        5

我到目前为止写的查询是:

SELECT     tblEntities.EntityID, tblEntities.ShortName, tblScheduling.ScheduleID
FROM         tblScheduling RIGHT OUTER JOIN
                      tblEntities ON tblScheduling.EntityID = tblEntities.EntityID
WHERE     (tblScheduling.SchedulingYearID = @SchedulingYearID) 
AND (tblEntities.Active = 1)
ORDER BY tblEntities.EntityID

我的问题是使用此查询它将不包括没有调度信息的活动实体(例如上面示例中的EntityID 4).我可以编写查询以显示所有活动实体及其计划状态,但是一旦我开始通过SchedulingYearID限制它,我将丢失这些特定实体.

是否有任何解决方案,我显然缺少,而不必诉诸子查询,游标等?如果不是,这不是什么大问题,我只是觉得我在这里错过了一些简单的东西.



1> Charles Bret..:

试试这个...连接条件被评估以产生中间连接结果集,然后,(对于外部连接),在"继续"之前,所有来自"外部"的行都被添加回去...在评估条件的情况下完成所有连接后......

SELECT E.EntityID, E.ShortName, S.ScheduleID
FROM  tblEntities E 
     Left Join tblScheduling S 
        ON S.EntityID = E.EntityID
           And S.SchedulingYearID = @SchedulingYearID 
WHERE E.Active = 1
ORDER BY E.EntityID

我改变了你的连接顺序,因为我更喜欢左连接......但这没关系

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有