这是来自Oracle Database 10g:SQL Fundamentals。 原始的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
嗯,我想做的是控制没有员工与自己比较。 这是我的变种bevore我检查了解决方案。
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出错了,你能帮我解决一下这段代码吗?
提前谢谢。
答案 0 :(得分:0)
该问题要求您确定任何员工,其薪资和佣金与部门1700中员工的薪资和工资的任何组合相匹配。问题并未说明将员工排除在该部门之外。因此,它们出现在结果集中是完全正确的。
“一名员工无法与自己相匹敌。”
您不匹配员工,而是匹配薪水。事实上,目标工资列表是从部门1700上的子查询生成的:它可以很容易地成为CSV文件中的数字列表。
让我们进行思考实验。 1700部门有三名员工:
name | salary | comm
-----------+---------+-----
CHIP | 10,100 | 0
RUNCITER | 12,200 | 0
CONLEY | 10,500 | 0
公司其他人的收入都不超过10K。
那么问题的答案是什么:有多少员工的薪水和佣金与1700部门员工的工资和佣金相匹配?
然后乔获得适度加薪,工资看起来像这样:
name | salary | comm
-----------+---------+-----
CHIP | 10,500 | 0
RUNCITER | 12,200 | 0
CONLEY | 10,500 | 0
那么现在对同一个问题的答案是什么?
两种情况下答案都是'三'。
为什么?
因为SQL是基于集合的编程语言,并且作为部门1700中的员工获得确切薪水和佣金的所有员工的集合必须包括在部门1700中工作的所有员工。
有一个不同的集合,即1700部门中没有自己在1700部门工作的员工获得确切工资和佣金的所有员工的集合。但这不是SQL Fundamentals测验正在寻找的设置对