3

私はクエリで立ち往生しており、実行がどのように行われるかを本当に考えることができません。どんな助けも大歓迎です:

クエリは、すべてのプロジェクトで働く従業員の詳細を見つけるために考案されています。

クエリは次のとおりです。

SELECT E.LNAME, E.FNAME
FROM EMPLOYEE E
WHERE NOT EXISTS
(
    SELECT PNUMBER
    FROM PROJECT
    WHERE PNUMBER NOT EXISTS 
    (
        SELECT PNO 
        FROM WORKS_ON
        WHERE ESSN=E.SSN 
    ) 
);

DB 構造は次のとおりです。

列を持つテーブル プロジェクト:

Pname、Pnumber、Plocation、および dnum

列を持つテーブルworks_on:

ESSN、PNO、および営業時間

カラムを持つテーブル Employee :

Fname、minit、Lname、SSN、Bdate、住所、性別、給与、superssn、dno

このクエリがどのように実行されるかを誰かが簡単な言葉で説明できれば、非常に役に立ちます。

4

3 に答える 3

10

サブクエリが少なくとも 1 つの行を返す場合、SQL EXISTS 条件は「満たされる」と見なされます。

したがって、NOT EXISTS を暗示することで、サブクエリがゼロ行を返すようにしたいので、その知識を持ってクエリを見てみましょう

SELECT E.LNAME, E.FNAME
FROM EMPLOYEE E
WHERE NOT EXISTS (SELECT PNUMBER
FROM PROJECT
WHERE PNUMBER NOT EXISTS (SELECT PNO 
FROM WORKS_ON
WHERE ESSN=E.SSN ) );

ネストされた 2 つの NOT EXISTS ステートメントがあり、一方が他方に依存しているため、SQL はそれらを逆の順序で実行する必要があります。照会される最初のものはこれです (最後のもの):

SELECT PNO 
    FROM WORKS_ON
    WHERE ESSN=E.SSN

これがゼロ行を返した場合 (NOT EXISTS と言ったため)、次のクエリが実行されます。

SELECT PNUMBER
    FROM PROJECT

繰り返しますが、これはゼロ行を返す必要があり、そうであれば、最初のクエリである最後のクエリを実行します。

SELECT E.LNAME, E.FNAME
FROM EMPLOYEE E

本質的に、すべての「NOT EXIST」サブクエリは、前のクエリを実行するためにゼロ行を返す必要があります。そうしないと、最終的に 0 行 (結果なし) になります。

EXISTS 条件の詳細については、こちら

于 2013-02-25T07:42:27.907 に答える