SQL没有产生预期的效果

问题描述:

我有与此相关的特定查询三个表:SQL没有产生预期的效果

  • Lawson_Employees:LawsonID(PK),LastNameFirstNameAccCode(数字)
  • 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#) 
+1

其实没有必要使用NZ()对于这一点,我建议你避免不必要的函数调用。 – 2010-05-29 02:33:35

+0

那么你有什么建议?从OP看来,数据不会被返回,这很可能是因为空值被排除在外。这是使用Nz最简单的事情。我认为没有必要投票给出一个广义的评论,除非提供了替代解决方案,否则这可能是例外。 – Fionnuala 2010-05-29 07:37:29

+0

@Remount,我得到的结果回来。他们看起来不完整。我们星期五有一个网络中断,所以我将无法测试答案,直到星期二(办公室星期一关闭假期) – AnonJr 2010-05-30 12:39:31