从oracle中的两个表中选择并计算numdays

时间:2017-07-07 06:17:57

标签: oracle

我正在休假计算。我有请求表和员工表。

他们的关系是员工可以请求许多叶子。即

请假表的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

1 个答案:

答案 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函数。其他数据库需要不同的功能。

  • 如果您使用的是Oracle,请将ISNULL(替换为NVL(
  • 如果你正在使用PostgreSQL或MySQL,你将需要命令COALESCE(

ISNULL()NVL()COALESCE()中的注释。正如@Ronnis指出的那样,任何符合ANSI标准的数据库都应该支持COALESCE()函数。

进一步查看文档,使用COALESCE()而不是NVL()ISNULL()可以获得更好的查询效果。前者将短路评估,而其他两个则不会。