簡體   English   中英

SQL中的NOT EXISTS子句

[英]NOT EXISTS clause in SQL

我一直陷於查詢中,我真的無法思考執行是如何進行的,我們將不勝感激任何幫助:

該查詢旨在查找在所有項目中工作的員工的詳細信息。

查詢是:

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 
    ) 
);

數據庫結構為:

帶有列的表項目:

Pname,Pnumber,Plocation和dnum

表works_on與列:

ESSN,PNO和小時

表雇員與列:

姓,名,姓,SSN,約會,地址,性別,薪水,superssn和dno

如果有人可以用簡單的語言解釋此查詢的執行方式,則將非常有幫助。

如果子查詢返回至少一行,則認為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 ) );

有兩個嵌套的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條件的更多信息,請點擊此處

我知道這是一個古老的問題,但是我對此很感興趣,所以花了一些時間,這樣就浪費了很多精力。

首先,我不知道內部<column name> NOT EXISTS <subquery>的語法,但它似乎等效於<column name> NOT IN <subquery> 只是這個想法使查詢對我來說更全面,因為它更清楚地將內部查詢鏈接到PROJECT
所以我從

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

細分步驟:

  • 內部查詢僅列出您員工從事的所有項目編號。

      SELECT PNO FROM WORKS_ON WHERE ESSN=E.SSN 
  • 中間查詢采用補碼。 結果是您的員工無法使用的所有項目編號。

      SELECT PNUMBER FROM PROJECT WHERE PNUMBER NOT IN ( -- projects that the employee works on ) 
  • 如果存在員工不從事的項目,那么他就不會對所有項目都進行工作,因此不應將其包括在結果中。

     SELECT E.LNAME, E.FNAME FROM EMPLOYEE E WHERE NOT EXISTS ( -- projects that the employee does not work on ) 

Keyzer的答案足以解決這個問題。 但是我想補充一點

SQL查詢的執行從內部查詢開始。 因此,在您的查詢中,第一個in where子句首先執行

在不存在PNUMBER的情況下(從WOSNS_ON中選擇PNO,ESSN = E.SSN)

根據上面的查詢結果,下面的其他查詢將運行。

WHERE NOT EXISTS (
    SELECT PNUMBER
    FROM PROJECT
    WHERE PNUMBER NOT EXISTS (**Resultset**)

總結我的觀點-您需要根據子查詢中的結果集調試查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM