首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助理解此TSQL连接行为。

需要帮助理解此TSQL连接行为。
EN

Stack Overflow用户
提问于 2016-03-04 19:43:09
回答 2查看 90关注 0票数 0

我只是不知道如何谷歌为我的问题,所以我道歉,如果已经有一个答案,这个问题。我的查询正在工作,但当我进行故障排除时,我遇到了我不明白的行为。

我有三张表格,它们的结构完全一样--一张是给被解雇的员工,一张是给选择放弃医疗保险的员工,还有一张是给没有医疗保险的员工。数据中有多家公司,我是按公司和部门分组的。

我正在进行完全的外部连接,因为某些公司/部门组可能有0名终止员工,但可能有一些放弃员工(例如)。

这三个源表的结构是:Company-部门-NumbOfEmployees

目标视图的结构是:

所以我基本上是在整理数据。

如果我将表1连接到表2,然后将表2连接到表3,我将得到所需的数据。

如果我将表1连接到表2,然后将表1连接到表3,则不会。我将得到一个额外的行,例如,在表1中不存在数据,但在表2中存在数据。

目视表现如下:

我不明白幕后到底发生了什么事,不足以弄清楚这种行为。为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-04 20:57:47

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

执行“坏”连接( T2和T3连接到T1),假设在T2和T3中存在一行,而不是T1。

那么你基本上就是这样做的:

代码语言:javascript
复制
First Join
T1    T2    
NULL  Data

Second Join
T1    T3
NULL  Data

而且,由于您没有将T2加入到T3中,所以在两列中都看不到“数据”的连接,因此它创建了两行。一个代表第一个加入,一个代表第二个。

要真正平平数据,您应该在连接条件下将T2和T3之间的关系包含到T3 (T3连接到T1和T2)中。

至少,我认为可以使用,因为这两个连接都是完全外部的。

票数 2
EN

Stack Overflow用户

发布于 2016-03-04 19:51:24

如果将数据扁平化,指的是每个雇员有来自其他表的信息的一行,那么full outer join是一种可能性。另一个是带有聚合的union all

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35804763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档