2010-12-16 83 views
1

是什麼意思查詢這是什麼意思查詢

select fname, lname 
    from Owner 
    where not exists 
     (select fname, lname 
      from Trainer) 

什麼我的理解:它返回FNAME和LNAME從表所有者那裏這些名稱不是在桌子教練exsit? 對不對?

回答

3

查找存在於Owner表中但不存在於Trainer表中的人員的姓名。

+8

這可能是一個意圖,但健忘的查詢作者並沒有將子選擇與頂級選擇關聯起來。如果'Trainer'爲空,則查詢返回'Owner'的所有行,否則返回無行。 – 9000 2010-12-16 20:43:55

+0

@ 9000:非常漂亮。我不能相信我錯過了這一點。 – AgentConundrum 2010-12-16 20:49:42

+0

但是當我運行查詢時沒有顯示任何結果,雖然兩個表都不一樣 – Stive 2010-12-16 20:49:48

2

owner表中找不到trainer表中不存在的所有人的列表,這是一個非常蹩腳的方式。

所以,如果Owner表包含

---------------- 
fname | lname 
---------------- 
clark | kent 
lois | lane 
peter | parker 

和訓練表包含

---------------- 
fname | lname 
---------------- 
peter | parker 
hal  | jordan 

你應該得到一個結果集:

---------------- 
fname | lname 
---------------- 
clark | kent 
lois | lane 

更新

實際上,如果Trainer表中有任何記錄,您的查詢將不會返回任何內容。您應該使用:

select fname, lname 
from Owners 
where not exists (
    select fname, lname 
    from trainers 
    where fname=Owners.fname 
      and lname=Owners.lname 
    ) 
+0

這是蹩腳的,因爲它效率低下。加入時最好做到這一點。 – 2010-12-16 20:45:23

+0

但當我運行查詢沒有結果顯示,雖然兩個表都不同 – Stive 2010-12-16 20:49:40

+0

是嗎?我不確定MySQL,但MSSQL和Oracle處理得很好,通常使它比聯接更高效。 – Lucero 2010-12-16 20:49:41

1

該查詢有兩個部分:'select'和'where'。 看那其中第一部分:

where not exists 
     (select fname, lname from Trainer) 

這where子句評估爲「真」,如果有沒有在訓練表,併爲「假」,如果有那麼點意思。現在看看'select'部分:

select fname, lname from Owners 

這將從'Owners'表中選擇所有行。

把它放在一起:查詢選擇Owner表中的所有行IF(並且只有)如果Trainer表中沒有任何內容 - 並且如果存在則絕對沒有。