-2

これは、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. もしオラクルが間違っていたら、このコードを手伝ってくれませんか?

前もって感謝します。

4

1 に答える 1

0

この質問では、給与とコミッションが部門1700の従業員の給与と給与の任意の組み合わせと一致する従業員を特定するように求められます。この質問は、その部門から従業員を除外することはできません。したがって、それらが結果セットに表示されるのは非常に正しいことです。

「1人の従業員は自分自身を一致させることはできません。」

あなたは従業員と一致していません、あなたは給与と一致しています。たまたま、目標給与のリストが部門1700のサブクエリから生成されます。これは、CSVファイルの数値のリストでも同じように簡単に作成できます。


思考実験をしましょう。部門1700には3人の従業員がいます。

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  

では、同じ質問に対する答えは今何ですか?

  1. まだ3つ

どちらの場合も、答えは「3」です。

なんで?

SQLはセットベースのプログラミング言語であるため、部門1700の従業員として正確な給与とコミッションを獲得するすべての従業員のセットには、部門1700で働くすべての従業員を含める必要があります。

別のセットがあります。これは、部門1700で働いていない、部門1700の従業員として正確な給与とコミッションを獲得するすべての従業員のセットです。ただし、SQLの基礎クイズで求めているセットではありません。

于 2013-01-26T21:55:35.400 に答える