2016-03-04 33 views
0

我只是不知道如何谷歌我的问题,所以我很抱歉,如果有一个答案已经存在这个问题了。我有我的查询工作,但当我遇到问题时,我遇到了我不明白的行为。需要帮助了解这个TSQL连接行为

我有三张结构完全相同的表格 - 一个用于已被终止的员工,一个用于选择放弃医疗保险的员工,另一个用于没有医疗保险的员工。这些数据中有多家公司,我按公司和部门进行分组。

我在做全外连接,因为有些公司/部门组可能有0个终止员工,但可能会有一些豁免员工(例如)。

三个源表的结构是: 公司--- ---司NumbOfEmployees

目的地视图的结构是:

公司--- ---司NumbOfTermEmp-- -NumbOfWaiverEmp --- NumbOfNonMedEmp

所以我基本上把数据弄平了。

如果我将表1连接到表2,然后将表2连接到表3,则可以获得我期望的数据。

如果我加入表1到表2,然后表1到表3,我不会。其中,例如,在表1中不存在的数据,但它见下表2

视觉表现确实,我会得到一个额外的行:

enter image description here

我不明白是怎么回事背后足以弄清楚这种行为的场景。为什么是这样?

+2

请编辑您的问题样本数据和预期的结果。 –

+2

@JClark你能发布你的SQL代码吗?没有代码就很难看到问题。 – tt9

+0

我将致力于修改隐私和发布数据。 @GordonLinoff,我有一个工作的SQL语句,并带有期望的结果,我只是不明白我遇到的某个JOIN机制,它使我的工作SQL语句 –

回答

2

我可以立即想到至少有一种情况会导致这种情况。

做你的“坏”加入(T2和T3加入T1),假设你有一行存在于T2和T3,但不是T1。

那么你基本上这样做:

First Join 
T1 T2  
NULL Data 

Second Join 
T1 T3 
NULL Data 

而且因为无处你加入T2到T3,它不会看到“数据”的两列中的连接,因此它创建两行。第一次加入一次,第二次加入一次。为了使数据真正变平坦,您应该在您的连接条件中的T2 & T3与T3(T3连接到两个T1 & T2)之间建立关系。

至少,我认为将工作,两个连接都是全部。

+0

我将此标记为答案,因为它专门回答了问题,并帮助我了解发生了什么。谢谢! –

+1

再次感谢您选择理解。对我来说最关键的是与ISNULL功能组合在一起。当一个表的分部/公司(数据输入错误)为空值时,ISNULL帮助将这些行分组。 (ISNULL(T.Company,W.Company)),ISNULL(N.Division,ISNULL(T.Division,W.Division)) –

+0

我忘了提及它也是必要的有MAX()周围的总和,因为数列中组不BY: ,MAX(ISNULL(N.NumbOfNonMedEmp,0))\t \t \t \t \t \t \t \t \t \t AS 'NumbOfNonMedEmp' 没有max,则会抛出一个错误,表示该列不在group by子句中,因为数字在行之间是相同的,所以MAX在这里是可以的。 –

2

如果通过压扁数据,您的意思是每个员工一行其他表中的信息,那么full outer join是一种可能性。另一种是用union all聚集:

select NumbOfEmployees, 
     sum(NumTerminated) as NumTerminated, 
     sum(NumWaiver) as NumWaiver, 
     sum(NumNonMed) as NumNonMed 
from ((select Company, Division, 
       NumbOfEmployees as NumTerminated, 0 as NumWaiver, 0 as NumNonMed 
     from terminations 
    ) union all 
     (select Company, Division, 
       0 as NumTerminated, NumbOfEmployees as NumWaiver, 0 as NumNonMed 
     from waivers 
    ) union all 
     (select Company, Division, 
       0 as NumTerminated, 0 as NumWaiver, NumbOfEmployees as NumNonMed 
     from waivers 
    ) 
    ) cd 
group by Company, Division; 

Full outer join可以均是困难的工作,特别是与多个表,因为连接键可能不匹配较早加入。我的意愿是要列出所有公司和部门的名单,然后改用left join。或者,上述查询使用union allgroup by

+0

有趣。我以前从来没有想过UNION与聚合。这似乎更直接。我会试试看。 –