首页 > 解决方案 > 无法理解内部联接

问题描述

我试图理解内部连接的正确使用,但是当我必须调用超过 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(人力资源架构):

小时模式

谁能帮助我,我缺少什么,为什么它显示重复的行?

标签: sqloraclejoininner-join

解决方案


job_history表有 3 个外键:

  1. employee_id
  2. job_id
  3. department_id

INNER JOIN唯一的加入,DEPARTMENT_ID因此您将员工与其部门发生的任何工作的工作历史相匹配,但不一定是该员工特定的工作。相反,您可能想要加入或的employee_id组合。employee_iddepartment_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 );

推荐阅读