2014-01-29 22 views
0

我提前,如果这样的事情已经讨论了其他地方表示歉意,但如果有,我无法找到它(我什至不知道如何寻找这样的事情) 。我试图加入两张桌子,“员工”和“离开”。我想从“雇员”表中列出的每一位员工,并从“离开”表,其中“离开日期”(在休假表bdate列)比2014年1月1日(或当年更大的填充假数据报告)。问题在于并不是每个员工都有数据,所以我发现一个正常的加入只会从那些实际上有离职数据的员工那里提取数据。我想我要的是一个左连接,但我只能从两个表,其中居然还有两个表中该雇员(希望是有道理的)数据得到记录。多表连接的条件从一个表

Select bunch_of_columns, leave.bdate, SUM(leave.Vhours) as TotalVacationHours, SUM(leave.shours) as TotalSickHours 
from employees 
left join leave on employees.id=leave.id 
where employees.user_active ='1' AND leave.BDate >= '2014-01-01' 
group by employees.id 
Order by employees.user_last 

这产生了“2014-01-01”之后有留下记录的个人的一个记录。我想从从休假表中可用数据的职员表员工记录的完整列表(和空白,如果都没有),其中在休假表中的“bdate”列比元旦更大。

我想这一点:

+-----+----------+---------------+---------------+--------------+ 
|ID | Name  | Vacation Hrs | Sick Hrs  | Date   | 
+-----+----------+---------------+---------------+--------------+ 
| 1 | Bob  | 5    | 8    | 2014-01-01 | 
| 2 | Lucy  | NULL   | NULL   | NULL   | 
| 3 | Jerry | NULL   | NULL   | NULL   | 
| 4 | Dieter | 3    | 5    | 2014-01-08 | 
| 5 | Sprockets| NULL   | NULL   | NULL   | 
+-----+----------+---------------+---------------+--------------+ 

不是这个:

+-----+----------+---------------+---------------+--------------+ 
| row | Name  | Vacation Hrs | Sick Hrs  | Date   | 
+-----+----------+---------------+---------------+--------------+ 
| 1 | Bob  | 5    | 8    | 2014-01-01 | 
| 4 | Dieter | 3    | 5    | 2014-01-08 | 
+-----+----------+---------------+---------------+--------------+ 

回答

3

这是因为你的WHERE条件。

leave.BDate >= '2014-01-01' 

如果你做一个LEFT JOIN然后筛选右表中的东西的列不能NULL,这相当于做一个INNER JOIN

如果没有离开日期则记录不符合标准。你应该检查,而不是:

(leave.BDate >= '2014-01-01' OR leave.BDate IS NULL) 
+0

容易让你说!我不知道为什么没有发生在我身上。非常感谢,OGHaza和DRapp!这很好用! – user3059142

0

尝试使用完全外部加入这种情况。

从MSDN

完全外部联接或完整连接返回两个表中的所有行,匹配了地方匹配就可以制备和在没有匹配的行存在的地方放置NULL值的行。

2

另一种方式来写(如OGHaza指出的)是适用的日期条件结合部

Select 
     bunch_of_columns, 
     leave.bdate, 
     COALESCE(SUM(leave.Vhours), 0) as TotalVacationHours, 
     COALESCE(SUM(leave.shours), 0) as TotalSickHours 
    from 
     employees 
     left join leave 
      on employees.id=leave.id 
      AND leave.BDate >= '2014-01-01' 
    where 
     employees.user_active ='1' 
    group by 
     employees.id 
    Order by 
     employees.user_last 
+0

既然你提到了,这正是我怎么会做它在实践中;) – OGHaza