【发布时间】:2013-01-26 19:31:15
【问题描述】:
这是来自 Oracle 数据库 10g:SQL 基础。 原始的 Oracle 教科书。 从法语上讲,到目前为止,这一切都是真实的。
有一个任务让我很困扰:
显示工资和佣金与位置 ID 1700 中许多员工的工资和佣金相匹配的任何员工的姓氏、部门名称和工资。
要学习的主题是多列子查询。这意味着我们不能偏离所提供的模型:
SELECT column, column, ...
FROM table
WHERE (column, column, ...) IN
(SELECT column, column, ...
FROM table
WHERE condition);
好吧,我的数据库:
describe employees
Name Null Type
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
describe departments
Name Null Type
--------------- -------- ------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
有一个解决办法:
select
e.last_name,
d.department_name,
e.salary
from employees e, departments d
where e.department_id = d.department_id
and (salary, nvl(commission_pct, 0)) in
(select salary, nvl(commission_pct, 0)
from employees e, departments d
where e.department_id = d.department_id
and d.location_id = 1700);
选择了 36 行。
好吧,我开始检查了。似乎来自位置 1700 的员工与自己重复。 看:我们获取整个员工列表,然后将其与位置 1700 的员工并列。当然,会有重复。
我已经准备了一个包含一些数据的 excel 文件(所有员工、来自位置 1700 的员工、我自己想要的结果等)。在文件中它更加风景如画,并附有示例等。请看一看。
这是文件:https://skydrive.live.com/redir?resid=8CDFFBA921B002FE!150&authkey=!ADMRAE466BIunQM
嗯,我想做的是控制没有员工与自己进行比较。 这是我在检查解决方案之前的变体。
select lnme, dpt, slry
from
(
select
employee_id eid,
last_name lnme,
salary slry,
nvl(commission_pct,0) cpct,
d.department_name dpt,
location_id
from employees e
left join departments d
on e.department_id = d.department_id
)
where (slry, cpct) in
(select
employee_id ide,
salary slry,
nvl(commission_pct,0) cpct
from employees e
join departments d
on e.department_id = d.department_id and location_id = 1700)
and ide <> eid
我想确保没有员工与同一员工进行比较。但我失败了。
您能否对所有这些情况发表评论: 1.我是否完全错了,Oracle的解决方案是否完美。 2.如果Oracle错了,你能帮我写这段代码吗?
提前谢谢你。
【问题讨论】: