2015-06-03 138 views
-1

我有一個SQL服務器數據庫,我認爲即時通訊有一個連接問題,但它可能不是連接問題。這是一個簡單的存儲過程全外連接不工作

ALTER Proc [dbo].[proc_Time_NotEntered] 
(
@sDate datetime, 
@eDate datetime 
) 
AS 
BEGIN 
    Select (e.[emplname] + ', ' + e.[empfName]) as [FullName], 
      wip.wdate as [date], 
      Sum(case when wip.wdate between @sDate and @eDate and wip.windicator <> 'D' then wip.[whours] else 0 end) as [Hours], 
      dept.[DeptName] 

    From sab.dbo.employee as e 
    Join sab.dbo.wip as wip on e.[ID] = wip.wempID 
    join sab.dbo.department as dept on e.empdept = dept.deptID 

    where 
     wip.wdate between @sDate and @eDate 
     and e.[emplname] + ', ' + e.[empfName] <> ' No Selection, ' 
    Group by 
     e.[emplname], 
     e.[empfName], 
     dept.[DeptName], 
     wip.[wdate] 
    ORDER BY 
    -- wip.[wdate], 
    e.[emplname] + ', ' + e.[empfName] 
    return 1 
END 

隨着我國加入我都試過全外連接並獲得相同的結果。

我正在努力實現的目標:即使他們每天都沒有時間,我也想讓所有的員工都能夠成功。

+0

這不就是左連接嗎?完全外部連接會給你幾個小時沒有員工,我懷疑你的數據模型是否合理? –

+0

不,它不是,我只是想讓所有的員工,然後我會擔心的時間。 – user3120232

回答

1

您需要左連接才能返回沒有匹配wip記錄的員工。

Select e.emplname, wip.wdate 
From sab.dbo.employee as e 
Left Join sab.dbo.wip as wip on e.[ID] = wip.wempID and wip.wdate between @sDate and @eDate 
1

一些事情。首先,JOIN本身就是一個內部聯接。如果你希望所有的員工和其他一切都是可選:

select... 
from 
employees e 
left join wip 
on e.[ID] = wip.wempID 
and wip.wdate between @sDate and @eDate 

你需要對WIP的移動約束到的條款,否則你將最終獲得一個內部聯接依然。

+0

這兩個答案的隨機倒票是什麼? – Andrew

+0

downvote是因爲在你編輯你的答案之前,這是錯誤的。雖然 – Lamak

+0

仍然不會返回所有員工 – user3120232