SQL Join的问题

时间:2009-01-06 14:31:26

标签: sql database sql-server-2005

我有两个表,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限制它,我就会失去那些特定的实体。

我是否有任何解决方案,我显然无需借助子查询,游标等?如果不是,这不是什么大问题,我只是觉得我在这里错过了一些简单的东西。

3 个答案:

答案 0 :(得分:6)

试试这个...连接条件被评估以产生中间连接结果集,然后,(对于外连接),“外部”侧的所有行都被重新添加,然后继续前进...所有连接完成后评估条件......

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

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

答案 1 :(得分:0)

这是你在where子句中的条件: (tblScheduling.SchedulingYearID = @SchedulingYearID)

当没有tblScheduling信息时,这总是会失败。添加

(((tblScheduling.SchedulingYearID = @SchedulingYearID)OR(tblScheduling.SchedulingYearID为null))

或wathever null条件检查您的数据库使用。

答案 2 :(得分:0)

我认为麻烦的是WHERE子句过滤掉了SchedulingYearID为null的行。所以不要。

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