我被要求对给定的查询使用非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'重复一样。
答案 0 :(得分:1)
所以你所拥有的是一个交叉连接:你的连接条件不会为每个表标识唯一键,因此一个或多个具有多个记录的表会导致重复“唯一”属性。
没有源数据;很难确定,但我猜它是JOB_HISTORY表:START_DATE和END_DATE值在每一行都是唯一的。修复此问题的最简单方法是在JOB_ID上进行额外的连接:
and e.job_id = jh.job_id
添加此条件应导致JOB_HISTORY行仅返回员工的最新角色。
答案 1 :(得分:0)
您可以使用USING
代替多个WHERE
子句。你需要澄清你的问题。