2017-06-14 30 views
2

我有一張表格,裏面填寫了公司的電話號碼。 我的問題是,我們有一個僱員每一個號碼的行,所以如果他有一個主電話和一部手機,我們有他的兩行。SQL如何正確執行外部聯接

現在我需要顯示所有員工的電話號碼和手機號碼(如果有的話)和電子郵件列表,但電子郵件地址在另一個表格中。 即時通訊使用SQL。

一個例子:

PhoneTable

ID | EmpID | FullName  | Number  | Type  | 
---------------------------------------------------------------- 
    115 | 02 | ManuelSan | +34935556663 | Fix  | 
    116 | 02 | ManuelSan | +34652315453 | Mobile | 
    117 | 06 | Camillete | +34934445621 | Fix  | 
    118 | 07 | MarcusEsq | +34932547841 | Fix  | 
    119 | 08 | FionaYem  | +34965214785 | Fix  | 
    120 | 08 | FionaYem  | +34652132124 | Mobile | 

EmailTable

ID | empID | Fullname |  Email   | 
----------------------------------------------------------------- 
    25 | 02  | ManuelSan | [email protected]  | 
    26 | 06  | Camillete | [email protected]  | 
    27 | 07  | MarcusEsq | [email protected]  | 
    28 | 08  | FionaYem | [email protected]  | 

所以我想這個輸出

Fullname | Fix  |  Mobile |  Email 
------------------------------------------------------------------ 
ManuelSan | +34935556663 | +34652315453 | [email protected] 
Camillete | +34934445621 |  NULL  | [email protected] 
MarcusEsq | +34932547841 |  NULL  | [email protected] 
FionaYem | +34965214785 | +34652132124 | [email protected] 

但是我這樣做:

SELECT distinct telf.Fullname, telf.Number, acti.EMAIL 
    FROM PhoneTable telf 
    left outer join EmailTable as acti on acti.empID = telf.empID 

我知道我需要做別的事情,但我不知道是什麼。如果他有一部手機和一部手機,我每個員工都會得到兩行。

我該怎麼做?

問候,

+0

爲什麼所有的電子郵件條目都有相同的ID?爲什麼你將員工姓名存儲在兩個表中?你沒有僱員表嗎?一個員工可以有多個電子郵件嗎?每個員工可以有多個修理號碼?每個員工可以有多個手機號碼?如果我爲同一員工ID找到不同的員工姓名,該怎麼辦?什麼是表格唯一鍵? –

+0

並且每個員工是否至少有一部手機?每個員工是否至少有一個電子郵件地址? –

+0

對不起,關於電子郵件表上的同一個ID,只是改變了它。 而不是,電話可以爲空,但電子郵件地址是強制性的。 – Mueretee

回答

5

大量冗餘數據,可能不一致;但如果我們假設empid定義了名稱並且PhoneTable包含每個員工的條目,則查詢可能如下所示。查詢的第一部分將一名員工的不同記錄組合成一條記錄;左外連接然後獲得相應的電子郵件。注意查詢仍未完成,如果有是有一個電子郵件,但甚至沒有一個電話號碼的員工:

select * 
from (select empid, 
      max(fullname), 
      max(case when type='Fix' then Number else NULL end) as fix, 
      max(case when type='Mobile' then Number else NULL end) as Mobile 
     from PhoneTable 
     group by empid) phone 
    left outer join EMailTable e on phone.empid=e.empid 
+0

對,對不起,我只是修改了。 它的工作原理,謝謝! – Mueretee

4

試試這個:

select 
e.FullName, 
t1.Number as "Fix", 
t2.Number as "Mobile", 
em.Email 
from 
(
    select distinct 
    EmpId, 
    FullName 
    from PhoneTable 
) e 
left join PhoneTable t1 on t1.EmpId = e.EmpId and t1.Type = 'Fix' 
left join PhoneTable t2 on t2.EmpId = e.EmpId and t2.Type = 'Mobile' 
left join EmailTable em on em.empID = e.EmpId 
+0

該解決方案也適用。 謝謝! – Mueretee

1

如果你有固定的電話類型的號碼,你可以用一個做到這一點每個類型的連接,就像這樣(假設你有一個僱員表):

select e.EmpId, pt1.Number as "PtFix", pt2.Number as "PtMobile" 
from Employee e 
    left join PhoneTable pt1 
    on (e.EmpId = pt1.EmpId and pt1.Type = 'Fix') 
    left join PhoneTable pt2 
    on (e.EmpId = PhoneTable.EmpId and pt2.Type = 'Mobile') 

如果有機會,你會推出更多的手機類型(例如辦公室),你可以對其進行聚合到一個數組或連接mysql中:

select e.EmpId, group_concat(pt.Number) as numbers 
from Employee e 
left join PhoneTable pt 
    on (e.EmpId = pt.EmpId) 
group by e.EmpId 
2

我的做法是:

SELECT mail.FullName, phonefix.Number, phonemob.Number, mail.Email 
    FROM EmailTable mail 
FULL OUTER JOIN PhoneTable phonefix 
ON mail.empID = phonefix.empID 
AND phonefix.Type = 'Fix' 
FULL OUTER JOIN PhoneTable phonemob 
ON mail.empID = phonemob 
AND phonemob.Type = 'Mobile' 
當然

如果你有一個Employee表。從員工表開始,使用左外連接鏈接到電話號碼和郵件

0

你打電話電子郵件表的表是EMPLOYEE表真的。它每個員工只有一個入口。所以每個員工只有一個電子郵件地址。至於電話號碼,我認爲每個類型和員工可以有零個或一個電話號碼。 (如果可以有更多,我們只挑一個。)

select e.fullname, p.fix, p.mobile, e.email 
from emails 
left join 
(
    select 
    empid, 
    max(case when type = 'Fix' then number end) as fix, 
    max(case when type = 'Mobile' then number end) as mobile 
    from phones 
    group by empid 
) p on p.empid = e.empid;