ORACLE:多列子查询

时间:2013-01-26 19:31:16

标签: oracle select subquery

这是来自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出错了,你能帮我解决一下这段代码吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

该问题要求您确定任何员工,其薪资和佣金与部门1700中员工的薪资和工资的任何组合相匹配。问题并未说明将员工排除在该部门之外。因此,它们出现在结果集中是完全正确的。

  

“一名员工无法与自己相匹敌。”

您不匹配员工,而是匹配薪水。事实上,目标工资列表是从部门1700上的子查询生成的:它可以很容易地成为CSV文件中的数字列表。


让我们进行思考实验。 1700部门有三名员工:

name       | salary  | comm
-----------+---------+-----
CHIP       |  10,100 |    0  
RUNCITER   |  12,200 |    0  
CONLEY     |  10,500 |    0  

公司其他人的收入都不超过10K。

那么问题的答案是什么:有多少员工的薪水和佣金与1700部门员工的工资和佣金相匹配?

  1. 然后乔获得适度加薪,工资看起来像这样:

    name       | salary  | comm
    -----------+---------+-----
    CHIP       |  10,500 |    0  
    RUNCITER   |  12,200 |    0  
    CONLEY     |  10,500 |    0  
    

    那么现在对同一个问题的答案是什么?

    1. 还是三个
    2. 两个
    3. 两种情况下答案都是'三'。

      为什么?

      因为SQL是基于集合的编程语言,并且作为部门1700中的员工获得确切薪水和佣金的所有员工的集合必须包括在部门1700中工作的所有员工。

      有一个不同的集合,即1700部门中没有自己在1700部门工作的员工获得确切工资和佣金的所有员工的集合。但这不是SQL Fundamentals测验正在寻找的设置对