2017-07-07 61 views
1

我正在做假期計算。我有離開請求表和員工表。選擇並計算來自oracle中兩個表的numdays

他們的關係是員工可以要求許多樹葉。即

請假表具有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

你實際使用哪個數據庫? – Jacobm001

回答

2

你需要你的請假申請表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 
; 

ISNULL函數被MSSQL服務器使用。其他數據庫需要不同的功能

  • 如果你使用的是Oracle,與NVL(更換ISNULL(
  • 如果您使用的是PostgreSQL或MySQL,您需要命令COALESCE(

記下ISNULL()NVL() VS COALESCE()。正如@Ronnis指出的那樣,任何ANSI兼容的數據庫都應該支持COALESCE()函數。

展望文檔遠一點,你可以使用COALESCE()NVL()ISNULL()獲得更好的查詢性能。前者會縮短評估,而另外兩個則不會。

+0

謝謝你的工作就像一個魅力!出色的解決 – danielad

+0

@danielad:沒問題;很高興它的工作。 :) – Jacobm001

+2

我認爲更好的解決方案是使用符合ANSI的替代COALESCE,而不管您使用什麼數據庫。 – Ronnis