[英]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.