2013-04-18 138 views
1

我有3桌選擇查詢加入3個表

企業人事:ID,名稱
:ID,名稱
Match_Dept_Per:dept_id爲,pers_id,workInfo

外鍵:
dept_id - > Department.id
pers_ ID - > Personel.id

實施例的數據:

企業人事:
1,埃米爾Civas
2,Sercan恰伊

部:
1,銷售
2,計劃

Match_Dept_Per:
1,1,經理

我想要做的是,列出的人民的名字,他們的部門名稱和workInfos像:

ID | Pers. Name | Dept Name | Work Info 
--------------------------------------- 
1 | Emir Civas | Sales  | Manager 

我可以用一個簡單的做到這一點select query:

select p.id, p.name, d.name, m.workInfo 
    from personel p, department d, match_dept_per m 
where p.id = m.pers_id and d.id = m.dept_id; 

這是我的模式和此查詢的sample fiddle

但是,我需要的是顯示其他人,他們的ID沒有插入match_dept_per表。並將「未知」設置爲空值。像:

ID | Pers. Name | Dept Name | Work Info 
------------------------------------------ 
1 | Emir Civas | Sales  | Manager 
2 | Sercan Tuncay | Unknown | Unknown 

由於我使用Match_Dept_Per表,如果Personel ID沒有添加,我什麼也做不了。

有什麼建議嗎?

+0

我相信你需要將ISNULL()函數作爲SQL語句的一部分。 ISNULL(check_expression,replacement_value),所以這將允許你替換檢查值,如果null與UNKNOWN。我不會發布答案,因爲我沒有時間重寫您的查詢。 – AxGryndr

回答

4

使用left outer join包括即使他們不與其他表相關聯的所有的人:

select p.id, 
     p.name, 
     ifnull(d.name, 'Unknown') DepName, 
     ifnull(m.workInfo, 'Unknown') workInfo 
    from personel p 
     left outer join match_dept_per m 
      on p.id = m.pers_id 
     left outer join department d 
      on d.id = m.dept_id 

這裏是一個demo fiddle

由於您似乎使用MS SQL,因此您可能需要使用isnull()而不是ifnull()。但是我會忽略它,因爲我認爲在使用數據的代碼(Java,C#,無論)中最好有一個NULL。你可以控制那裏的輸出。

+0

要完成此答案,請爲部門和match_dept_per中的字段添加ifnull()。 –

+0

謝謝,它工作。 –