我只是不知道如何谷歌为我的问题,所以我道歉,如果已经有一个答案,这个问题。我的查询正在工作,但当我进行故障排除时,我遇到了我不明白的行为。
我有三张表格,它们的结构完全一样--一张是给被解雇的员工,一张是给选择放弃医疗保险的员工,还有一张是给没有医疗保险的员工。数据中有多家公司,我是按公司和部门分组的。
我正在进行完全的外部连接,因为某些公司/部门组可能有0名终止员工,但可能有一些放弃员工(例如)。
这三个源表的结构是:Company-部门-NumbOfEmployees
目标视图的结构是:
所以我基本上是在整理数据。
如果我将表1连接到表2,然后将表2连接到表3,我将得到所需的数据。
如果我将表1连接到表2,然后将表1连接到表3,则不会。我将得到一个额外的行,例如,在表1中不存在数据,但在表2中存在数据。
目视表现如下:

我不明白幕后到底发生了什么事,不足以弄清楚这种行为。为什么会这样呢?
发布于 2016-03-04 20:57:47
我可以立即想到至少一种可能导致这种情况的情况。
执行“坏”连接( 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)中。
至少,我认为可以使用,因为这两个连接都是完全外部的。
发布于 2016-03-04 19:51:24
如果将数据扁平化,指的是每个雇员有来自其他表的信息的一行,那么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 all和group by。
https://stackoverflow.com/questions/35804763
复制相似问题