选择“查询连接3表”

时间:2013-04-18 01:49:59

标签: sql sql-server sql-server-2008 select join

我有3张桌子

Personel :id,name
部门:id,姓名
Match_Dept_Per :dept_id,pers_id,workInfo

外键:
dept_id - > Department.id
pers_id - > Personel.id

示例数据:

人员:
1,Emir Civas
2,Sercan Tuncay

部门:
1,销售
2,计划

Match_Dept_Per:
1,1,经理

我要做的是,列出人名,部门名称和workInfos,如:

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

我可以使用简单的选择查询来完成此操作:

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,我什么也做不了。

有什么建议吗?

1 个答案:

答案 0 :(得分: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()。但我还是会遗漏,因为我觉得在你使用数据的代码中有一个NULL会更好(Java,C#,等等)。你可以在那里控制输出。