sql - 无法理解内部联接
问题描述
我试图理解内部连接的正确使用,但是当我必须调用超过 2 个表时遇到问题,我使用 oracle HR 模式进行测试,所以例如我尝试这个查询:
select emps.employee_id,
emps.first_name,
dep.department_name,
dep.department_id,
jh.job_id
from employees emps
inner join departments dep
on emps.department_id = dep.department_id
inner join job_history jh
on dep.department_id = jh.department_id;
这显示了以下结果:
我知道它错了,因为首先它显示重复的行,其次如果我运行这个查询
select * from job_history where employee_id = 100;
它没有显示任何结果,这意味着员工 100 (steven) 不应该出现在第一个查询的结果中,我希望第一个查询向我显示关于员工、部门和 job_history 的数据结果,它们有共同点部门 ID
HR(人力资源架构):
谁能帮助我,我缺少什么,为什么它显示重复的行?
解决方案
该job_history
表有 3 个外键:
employee_id
job_id
department_id
您INNER JOIN
唯一的加入,DEPARTMENT_ID
因此您将员工与其部门发生的任何工作的工作历史相匹配,但不一定是该员工特定的工作。相反,您可能想要加入或的employee_id
组合。employee_id
department_id
因此,如果您想要该员工在任何部门的工作历史记录:
select emps.employee_id,
emps.first_name,
dep.department_name,
dep.department_id,
jh.job_id
from employees emps
inner join departments dep
on ( emps.department_id = dep.department_id )
inner join job_history jh
on ( emps.employee_id = jh.employee_id );
或者,如果您想要该部门内该员工的工作历史:
select emps.employee_id,
emps.first_name,
dep.department_name,
dep.department_id,
jh.job_id
from employees emps
inner join departments dep
on ( emps.department_id = dep.department_id )
inner join job_history jh
on ( emps.employee_id = jh.employee_id
and emps.department_id = jh.department_id );
推荐阅读
- email - 如果发件人和收件人的电子邮件 ID 相同,则电子邮件会被 Outlook 发送垃圾邮件/阻止通过发送网格发送
- android - 拒绝外围触摸输入
- javascript - 如何使用 NodeJS 将文件从 AWS Glacier 存储直接下载到本地 PC?
- vb.net - 具有多个 IIf 表达式的 SSRS 报表生成器,如何阅读代码
- regex - Python中缺少正则表达式结果
- python-3.x - 从第一个匹配行上方的主数据帧返回所有行(从辅助数据帧的顶部)
- c# - 如何使 C# 中的 datagridview 滚动缓慢 - 无法查看整行内容
- ios - 仅在发布版本中找不到适用于应用程序的有效“aps-environment”权利字符串
- wordpress - WordPress 未将插件/主题与 FTP 中的内容同步
- angular - 我们可以使用不同的路由组件拥有相同的路径吗 - Angular Routing