これは、Oracle Database 10g: SQL Fundamentals からのものです。オリジナルのオラクル教科書。率直に言って、これまでのところすべてが現実です。
私を悩ませているタスクがあります:
ロケーション 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 の従業員と並置します。もちろん、重複があります。
いくつかのデータ (すべての従業員、場所 1700 の従業員、自分の希望する結果など) を含む Excel ファイルを用意しました。ファイルでは、例などでより絵になります。どうぞ、ご覧ください。
これはファイルです: 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. 私が完全に間違っていて、オラクルのソリューションが完璧かどうか。2. もしオラクルが間違っていたら、このコードを手伝ってくれませんか?
前もって感謝します。