难以理解内部联接

Trouble understanding inner join

我试图理解内部联接的正确使用,但是当我不得不调用 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 的共同点是 department_id

HR(人力资源架构):

任何人都可以帮助我,我缺少什么,为什么它显示重复的行?

job_historytable有3个外键:

  1. employee_id
  2. job_id
  3. department_id

您的 INNER JOIN 仅在 DEPARTMENT_ID 上加入,因此您正在将员工与工作历史记录匹配,以查找在其部门发生的任何工作,但不一定是该员工的特定工作。相反,您可能想加入 employee_idemployee_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 );