多个非ansi加入

时间:2015-07-13 17:31:22

标签: sql oracle join

我被要求对给定的查询使用非ansi join: Q)使用以下字段显示上表中的记录 - 员工,员工姓名,部门ID,部门名称, 工作的开始日期,工作结束日期,职位,国家名称,地区名称,最高工资差异和员工工资

给我们的表是Oracle 11g中“hr”连接表中的标准

我使用了以下查询:

select e.Employee_id,
         first_name,
          e.deparment_id, 
         department_name,
          start_date,
          end_date,
          job_title, 
         country_name,
          region_name,
           (select max(salary) from employees)-salary
from employees e, 
     countries c, 
      departments d,
      job_history jh,
      jobs j,   
      locations l,
      regions r
where e.deparment_id = d.department_id 
and jh.employee_id = e.employee_id
and e.job_id = j.job_id
and d.location_id = l.location_id 
and l.country_id = c.country_id
and c.region_id = r.region_id;

我得到的输出在某些条目上是多余的。 我需要帮助解决冗余问题。

我的输出

101 Neena    90 Executive      28-10-93 15-03-97 President                     Unites States of America Americas  7000
101 Neena    90 Executive      21-09-89 27-10-93 President                     Unites States of America Americas  7000
102 Lex      90 Executive      13-01-93 24-07-98 Administration Vice President Unites States of America Americas  7000
200 Jennifer 10 Administration 01-07-94 31-12-98 Administration Assistant      Unites States of America Americas 19600
200 Jennifer 10 Administration 17-09-87 17-06-93 Administration Assistant      Unites States of America Americas 19600
176 Jonathon 80 Sales          01-01-99 31-12-99 Sales Representative          United Kingdom           Americas 15400
176 Jonathon 80 Sales          24-03-98 31-12-98 Sales Representative          United Kingdom           Americas 15400
201 Michael  20 Marketing      17-02-96 19-12-99 Marketing Manager             Canada                   Americas 11000

期望的输出是没有任何冗余数据的地方,就像我们可以看到'Neena'或'Jonathon'重复一样。

2 个答案:

答案 0 :(得分:1)

所以你所拥有的是一个交叉连接:你的连接条件不会为每个表标识唯一键,因此一个或多个具有多个记录的表会导致重复“唯一”属性。

没有源数据;很难确定,但我猜它是JOB_HISTORY表:START_DATE和END_DATE值在每一行都是唯一的。修复此问题的最简单方法是在JOB_ID上进行额外的连接:

and e.job_id = jh.job_id

添加此条件应导致JOB_HISTORY行仅返回员工的最新角色。

答案 1 :(得分:0)

您可以使用USING代替多个WHERE子句。你需要澄清你的问题。