我有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,我什么也做不了。
有什么建议吗?
答案 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#,等等)。你可以在那里控制输出。