我正在休假计算。我有请求表和员工表。
他们的关系是员工可以请求许多叶子。即
请假表的Employee_Serail_ID为一对多。我已完成以下查询以选择所有请假请求并计算天数。
SELECT (LR.DATE_TO - LR.DATE_FROM) as NumDays ,
LR.EMPLOYEE_SERIAL_ID, LR.ID as LEAVE_REQUEST_ID
FROM TBL_LEAVE_REQUEST LR ;
NUMDAYS EMPLOYEE_SERIAL_ID LEAVE_REQUEST_ID
3 EMP_286 LEAVE_35
2 EMP_243 LEAVE_36
2 EMP_284 LEAVE_37
3 EMP_243 LEAVE_38
32 EMP_243 LEAVE_39
0 EMP_303 LEAVE_40
1 EMP_241 LEAVE_41
但是,我发现所有未请求请假的员工都不会使用此查询进行选择。
我想修改此查询 - 如果员工已请求休假,则会显示numdays,如果没有,则此查询应返回所有员工的Numdays 0。
NUMDAYS
答案 0 :(得分:2)
您需要{leave} left join
离开请求表到您的实际员工表。这将为您提供员工记录,即使他们没有请假申请。
由于您尚未发布架构,并且您尚未指定实际使用的数据库,因此我无法为您编写大部分查询。你的逻辑看起来像这样:
SELECT
T.EMPLOYEE_ID
, ISNULL((LR.DATE_TO - LR.DATE_FROM), 0) as NumDays
, LR.EMPLOYEE_SERIAL_ID
, LR.ID as LEAVE_REQUEST_ID
FROM
TBL_EMPLOYEE T
LEFT JOIN TBL_LEAVE_REQUEST LR
on T.EMPLOYEE_ID = LR.EMPLOYEE_ID
;
MSSQL Server使用ISNULL
函数。其他数据库需要不同的功能。
ISNULL(
替换为NVL(
。 COALESCE(
。 ISNULL()
和NVL()
与COALESCE()
中的注释。正如@Ronnis指出的那样,任何符合ANSI标准的数据库都应该支持COALESCE()
函数。
进一步查看文档,使用COALESCE()
而不是NVL()
或ISNULL()
可以获得更好的查询效果。前者将短路评估,而其他两个则不会。