2013-04-18 99 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

谢谢,它工作。 –