2016-03-04 66 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與聚合。這似乎更直接。我會試試看。 –