2015-06-03 103 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