SQL没有产生预期的效果
问题描述:
我有与此相关的特定查询三个表:SQL没有产生预期的效果
- Lawson_Employees:
LawsonID
(PK),LastName
,FirstName
,AccCode
(数字) - Lawson_DeptInfo:
AccCode
(PK),AccCode2
(不要问,HR成立),DisplayName
- tblExpirationDates:
EmpID
(PK),ACLS
(日期),EP
(日期),CPR
(日期),CPR_Imported
(日期),PALS
(日期),Note
的目标是让我需要在所有那些谁在一个或多个证书已过期,报告中的数据,或将要在未来90到期天。
一些重要注意事项:
- 这是正在运行的VBScript中的一部分,所以在运行该脚本时被计算90天的日期。我在使用
2010-08-31
作为占位符,因为它在发布此问题时的结果。 - 所有卡片在月底到期。 (这就是为什么上述日期是8月底,而不是90天)
- 有效的EP卡取代ACLS认证,但只有后者是一些雇员的要求。 (在我得到这个问题之前我不会担心它,但如果我能得到帮助,我会接受)
- CPR列包含他们带到我们最后一堂课的到期日期。 (如果他们没有和我们一起上课,则为NULL)
- CPR_Imported列包含他们在其他地方接受的最后一个课程的到期日期。 (如果他们不把它放在其他地方,则为NULL,并且遵循以下策略)
- CPR类之间的区别对其他报告很重要。就本报告而言,我们真正关心的是哪一个是最新的 - 或者至少目前是最新的。
- 如果必须,我会暂时忽略ACLS和PALS,因为它不符合目前最大的问题是CPR培训。 (不是说别人不会,但他们并没有在最后一次会议上提到的...)
这里的查询我到目前为止,这是给我不错的数据:
SELECT
iEmp.LawsonID, iEmp.LastName, iEmp.FirstName,
dept.AccCode2, dept.DisplayName,
Exp.ACLS, Exp.EP, Exp.CPR, Exp.CPR_Imported, Exp.PALS, Exp.Note
FROM (Lawson_Employees AS iEmp
LEFT JOIN Lawson_DeptInfo AS dept ON dept.AccCode = iEmp.AccCode)
LEFT JOIN tblExpirationDates AS Exp ON iEmp.LawsonID = Exp.EmpID
WHERE iEmp.CurrentEmp = 1
AND ((Exp.ACLS <= #2010-08-31#
AND Exp.ACLS IS NOT NULL)
OR (Exp.CPR <= #2010-08-31#
AND Exp.CPR_Imported <= #2010-08-31#)
OR (Exp.PALS <= #2010-08-31#
AND Exp.PALS IS NOT NULL))
ORDER BY dept.AccCode2, iEmp.LastName, iEmp.FirstName;
仔细阅读结果集后,我想我错过了应该在结果集中的一些过期日期。我错过了什么吗?这是部门中唯一的开发人员很难接受的部分...没有人要求一点帮助。
答
我认为这个问题是在这里:
OR (Exp.CPR <= #2010-08-31#
AND Exp.CPR_Imported <= #2010-08-31#)
空比什么不小于或更高。
如果您需要没有有效CPR的人,则需要包含空值。
这可能是最容易使用的Nz:
OR (Nz(Exp.CPR,#2010-08-31#) <= #2010-08-31#
AND Nz(Exp.CPR_Imported,#2010-08-31#) <= #2010-08-31#)
其实没有必要使用NZ()对于这一点,我建议你避免不必要的函数调用。 – 2010-05-29 02:33:35
那么你有什么建议?从OP看来,数据不会被返回,这很可能是因为空值被排除在外。这是使用Nz最简单的事情。我认为没有必要投票给出一个广义的评论,除非提供了替代解决方案,否则这可能是例外。 – Fionnuala 2010-05-29 07:37:29
@Remount,我得到的结果回来。他们看起来不完整。我们星期五有一个网络中断,所以我将无法测试答案,直到星期二(办公室星期一关闭假期) – AnonJr 2010-05-30 12:39:31