【问题标题】:Trouble understanding inner join无法理解内部联接
【发布时间】:2020-09-25 22:05:29
【问题描述】:

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

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

【问题讨论】:

  • 您看到的是笛卡尔积的结果,当您的联接设置不正确时会发生这种情况(认识到笛卡尔在极少数用例中是可取的)。对连接语法进行快速的 Google 搜索将是一个很好的起点。另请查看有关笛卡尔积的出色问答。 stackoverflow.com/questions/30955338/…
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。只提供您需要的东西并将其与您的问题联系起来。在图片中包含图例/键和说明。
  • @philipxy OP 声明他们正在使用 HR 模式;这是由 Oracle 生成的标准模式,可以免费下载和安装,并且可以与 Oracle 数据库一起预安装(如果您选择该安装选项)。
  • @MT0 这并没有改变他们应该对我的 cmets 采取行动的事实。它甚至不相关。 How to Ask

标签: sql oracle join inner-join


【解决方案1】:

job_history 表有 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 );

【讨论】:

  • 我会更进一步...... Emp 到 JH,JH 到 Dpt,因为员工可以更换工作部门。通过这种方式,他可以看到员工在哪里,而不仅仅是基于他们现在所在的部门。因此,JH 也有服务日期。
  • 感谢您的回答,我会仔细检查并理解它:)
猜你喜欢
  • 2016-09-21
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多