嵌套查询,都使用NOT IN() - 这是如何工作的?

问题描述:

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

最内层查询将获取所有红色船只,然后内部查询将获取红色船只中所有预留的船只,然后外部查询将获取所有预留红色船只的船员。 –

您的查询显示不在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

这就是表格和代码的输出 –

这个查询试图排除所有谁保留一艘船除红色以外的任何颜色的水手。我相信我们可以用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 –