0

すべての従業員がいくつかのプロジェクトに取り組んでいる部門の名前をリストします。つまり、完全な質問をする従業員は存在しません。私はこれについて実際の答えを得るのに苦労しています.私の教授は私が間違っていることを教えてくれません. 私が持っているコードは

select dname
from division d, employee e, workon w
where e.did = d.did
and w.empid = e.empid
and not exists
(select empid
from workon
group by empid
having count (empid) >= all(select e.empid
from employee ee
where e.did = ee.did
group by ee.empid))
group by dname

私が持っているテーブルは

従業員

| EMPID |  NAME | SALARY | DID |
--------------------------------
|     1 | kevin |  32000 |   2 |
|     2 |  joan |  46200 |   1 |
|     3 | brian |  37000 |   3 |
|     4 | larry |  82000 |   5 |
|     5 | harry |  92000 |   4 |
|     6 | peter |  45000 |   2 |
|     7 | peter |  68000 |   3 |
|     8 | smith |  39000 |   4 |
|     9 |  chen |  71000 |   1 |
|    10 |   kim |  46000 |   5 |

分割

| DID |                    DNAME | MANAGERID |
----------------------------------------------
|   1 |              engineering |         2 |
|   2 |                marketing |         1 |
|   3 |           human resource |         3 |
|   4 | Research and development |         5 |
|   5 |               accounting |         4 |

ワーコン

| PID | EMPID | HOURS |
-----------------------
|   3 |     1 |    30 |
|   2 |     3 |    40 |
|   5 |     4 |    30 |
|   6 |     6 |    60 |
|   4 |     3 |    70 |
|   2 |     4 |    45 |
|   5 |     3 |    90 |
|   3 |     3 |   100 |
|   6 |     8 |    30 |
|   4 |     4 |    30 |
|   5 |     8 |    30 |
|   6 |     7 |    30 |
|   6 |     9 |    40 |
|   5 |     9 |    50 |
|   4 |     6 |    45 |
|   2 |     7 |    30 |
|   2 |     8 |    30 |
|   2 |     9 |    30 |
|   1 |     9 |    30 |
|   1 |     8 |    30 |
|   1 |     7 |    30 |
|   1 |     5 |    30 |
|   1 |     6 |    30 |
|   2 |     6 |    30 |
4

1 に答える 1

2

あなたはとても近くにいます。あなたがやろうとしていることは、「相関サブクエリ」と呼ばれます。クエリを実行しているテーブルのキーを、候補セットには寄与しないクエリのキーに関連付けていますが、where 句でフィルターとして機能します。

これを示すコードの重要な行は、次の NOT EXISTS 句の行です。

e.did = ee.did

集計 COUNT(...) の結果を比較してこれを行う代わりに、Employee テーブルと Workon テーブルの間で外部結合を実行して、何もしていない従業員がいるかどうかを確認し、それらの従業員に基づいて部門を見つけます。特定の部門には存在しません。

ここにあるのと同じ結合条件を表す Oracle 標準の HR サンプル チュートリアル テーブルを使用したクエリの例を次に示します。クエリを実行している場所ならどこでもこれらのテーブルにアクセスできる可能性があり、回答に興味がある可能性のある他の人もアクセスできるため、テーブルを作成せずにクエリを実行して、回答をいじることができます。クエリをテーブルに変換するのは比較的簡単なことなので、その演習はあなたに任せます。:)

以下のクエリの最後の大文字の行は、このクエリを相関サブクエリにする結合条件です。

select
    *
from
    hr.departments d
where
    not exists
    (
        select
             ee.employee_id
            ,ee.first_name
            ,ee.last_name
            ,dd.department_id
            ,dd.department_name
            ,jj.job_id
        from
             hr.employees   ee
            ,hr.departments dd
            ,hr.job_history jj
        where
                ee.department_id = dd.department_id
            and ee.employee_id   = jj.employee_id   (+)
            and jj.job_id is null

            AND D.DEPARTMENT_ID = DD.DEPARTMENT_ID
    )
于 2012-12-06T19:09:59.673 に答える