2017-10-18 206 views
-2
SELECT S.sname 
FROM Sailors S 
WHERE S.sid NOT IN (SELECT R.sid 
     FROM Reserves R 
     WHERE R.bid NOT IN (SELECT B.bid  
     FROM Boats B 
     WHERE B.color='red')) 

試圖理解這一點。這個查詢如何找到只保留紅色船隻和水手的船員的名字,這些船隻根本沒有預留任何船隻。一個NOT IN嵌套在另一個NOT IN如何工作?嵌套查詢,都使用NOT IN() - 這是如何工作的?

+1

什麼是你的問題先生? – Ravi

+0

最內層查詢將獲取所有紅色船隻,然後內部查詢將獲取紅色船隻中所有預留的船隻,然後外部查詢將獲取所有預留紅色船隻的船員。 –

回答

0

您的查詢顯示不在reservessailors的船隻不是red

您可以用這種方式重寫:

SELECT S.sname 
FROM Sailors S 
WHERE S.sid NOT IN (SELECT R.sid 
     FROM Reserves R 
     WHERE R.bid IN (SELECT B.bid  
     FROM Boats B 
     WHERE B.color <> 'red')) 
+0

https://ibb.co/bXqkRR –

+0

https://ibb.co/nj6Lt6 –

+0

這就是表格和代碼的輸出 –

0

這個查詢試圖排除所有誰保留一艘船除紅色以外的任何顏色的水手。我相信我們可以用JOIN以使其更具可讀性,例如:

SELECT s.name 
FROM sailors s LEFT JOIN reserves r ON s.sid = r.sid 
JOIN boats b on r.bid = b.bid 
WHERE b.color = 'Red' 
GROUP BY s.name 
HAVING COUNT(DISTINCT(b.color)) <= 1; 
+0

你可能排除沒有出現在儲備中的水手。 – NikNik

+0

@NikNik不再我猜.. –

+0

https://ibb.co/bXqkRR –