难以理解内部联接
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_history
table有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 );
我试图理解内部联接的正确使用,但是当我不得不调用 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_history
table有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 );