2017-11-17 20 views
0

これは宿題に関する質問ですが、私はこれ以上の難しさがありますが、私は実際にはもっと複雑なステートメントのいくつかの周りを頭で囲むことはできません。私は譲渡を完全にあきらめる前に、助けていただければ幸いです。教授とTAはどんな助けも断った。JOINまたは条件付きロジック4つ以上のテーブル

私はすべてのOracle DBのデモとして存在する「HR」テーブルを使用しています。 私は、特定の部署のすべてのジョブとロケーションを一意にリストアップする必要があります。下記のフォーム領域、場所、部署、ジョブ、および従業員:

場所:

Name      Null? Type 
----------------------------------------- -------- ---------------------------- 
LOCATION_ID     NOT NULL NUMBER(4) 
STREET_ADDRESS      VARCHAR2(40) 
POSTAL_CODE      VARCHAR2(12) 
CITY      NOT NULL VARCHAR2(30) 
STATE_PROVINCE      VARCHAR2(25) 
COUNTRY_ID      CHAR(2) 

ジョブズ:

Name      Null? Type 
----------------------------------------- -------- ---------------------------- 
JOB_ID     NOT NULL VARCHAR2(10) 
JOB_TITLE     NOT NULL VARCHAR2(35) 
MIN_SALARY      NUMBER(6) 
MAX_SALARY      NUMBER(6) 

従業員数:

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) 
これは、テーブルを持っています

部門:

Name      Null? Type 
----------------------------------------- -------- ---------------------------- 
DEPARTMENT_ID     NOT NULL NUMBER(4) 
DEPARTMENT_NAME    NOT NULL VARCHAR2(30) 
MANAGER_ID      NUMBER(6) 
LOCATION_ID      NUMBER(4) 

私は関係代数は、種類のどのようになるを通じて考えることができますが、私はそれがSQL構文に行くだろうか見当もつかない当然のようにします。もちろん、より単純な結合を行う方法はわかっていますが、すべての要件を1つのステートメントに集約する方法を理解していません。私はその後、DEPARTMENTS.DEPARTMENT_IDからLOCATION_IDを導出し、最終的に私の元JOB_TITLE選択LOCATION.LOCATION_ID = DEPARTMENTS.DEPARTMENT_IDに場所に参加する、= 80 DEPARTMENT_IDが、その後のマッチングJOB_TITLEを取得するためのジョブに参加しないすべてのUNIQUEまたはDISTINCT JOB_IDsを取得したいです。だから、どうなっているのだろう? 1つの選択肢ですべての情報を取得するには3つの結合を行う必要がありますか?

答えて

0

ようななめらかが、おそらく

新しい風加入:

select tloc.*, tdept.*, tjobs.* 
from locations tloc 
    inner join departments tdept on (tloc.location_id=tdept.location_id) 
    inner join employees templ on (tdept.department_id=templ.department_id) 
    inner join jobs tjobs on (templ.employee_id=tjobs.employee_id) 
where 
    tdept.department_id=80 

昔ながらの加入:

select tloc.*, tdept.*, tjobs.* 
from locations tloc, departments tdept, employees templ, jobs tjobs 
where 
    tloc.location_id=tdept.location_id 
    and tdept.department_id=templ.department_id 
    and templ.employee_id=tjobs.employee_id 
    ---- 
    and tdept.department_id=80 
+1

SQL初心者の昔ながらの結合を教えてください... –

+0

おそらく優先順位の逆転ですか?適切な標準の明示的な結合が優先されますか? –

0

これはあなたを助けるかもしれません。要件に応じて 'Where'条件を追加します。

select (select j.job_title from jobs j where j.JOB_ID=x.JOB_ID) as Job_Title , 
     (select dp.department_name from department dp where dp.department_id) as Department_Name, 
     (select l.City || l.State_province from Location l where l.location_id = x.location_id) as Location 
(select 
     e. JOB_ID, 
     D.DEPARTMENT_ID, 
     d.location_id 
from Employees e inner join Department d on e.DEPARTMENT_ID = d.DEPARTMENT_ID 
group by l.location_id,d.DEPARTMENT_ID , e.JOB_ID) x 
0

これは、あなたを始めようとするものです。あなたの必要性のコア2つのテーブル(JOB_IDのための)従業員および(location_idのための)部門から来ていると従業員と部門間の関係が共有DEPARTMENT_ID列を経由している(これは参加となります)

SELECT 
     e.JOB_ID 
    , d.LOCATION_ID 
FROM Employees e 
INNER JOIN Departments d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE e.DEPARTMENT_ID = 80 

今、あなたがする必要があります「ユニークさ」

一つの方法は、select distinctを追加すると、これは動作しますが、それは

SELECT DISTINCT 
     e.JOB_ID 
    , d.LOCATION_ID 
FROM Employees e 
INNER JOIN Departments d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE e.DEPARTMENT_ID = 80 

OR、などaggregatiなどの他の可能性を開くGROUP BYを使用するようにオプションを制限しないで取得する方法を見つけ出しますons

SELECT 
     e.JOB_ID 
    , d.LOCATION_ID 
    , COUNT(*) as count_of_employees 
FROM Employees e 
INNER JOIN Departments d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE e.DEPARTMENT_ID = 80 
GROUP BY 
     e.JOB_ID 
    , d.LOCATION_ID 

あなたが発見するために残すのは、結果に名前を付ける方法です。