我有两个表,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限制它,我就会失去那些特定的实体。
我是否有任何解决方案,我显然无需借助子查询,游标等?如果不是,这不是什么大问题,我只是觉得我在这里错过了一些简单的东西。
答案 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;