2017-10-18 4 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')) 

Essayer de comprendre cela. Comment cette requête trouve-t-elle les noms des marins qui n'ont réservé que des bateaux rouges et des marins qui ne réservent aucun bateau? Comment un NOT IN imbriqué dans un autre NOT IN fonctionne-t-il?Requêtes imbriquées, les deux utilisant NOT IN() - comment cela fonctionne-t-il?

+1

quelle est votre question monsieur? – Ravi

+0

La requête la plus interne ira chercher tous les bateaux de couleur rouge alors la requête interne ira chercher tous les bateaux réservés parmi les bateaux de couleur rouge alors la requête externe ira chercher tous les marins qui ont réservé les bateaux de couleur rouge. –

Répondre

0

Votre requête montre les sailors qui ne sont pas dans reserves avec un bateau qui n'est pas red.

Vous pouvez réécrire ainsi:

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

Ce sont les tables et la sortie du code –

0

Cette requête tente d'exclure tous les marins qui ont réservé un bateau avec une autre couleur que le rouge. Je crois que nous pouvons utiliser JOIN pour le rendre plus lisible, par exemple:

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

Vous excluez probablement les marins qui n'apparaissent pas du tout dans les réserves. – NikNik

+0

@NikNik pas plus je suppose .. –

+0

https://ibb.co/bXqkRR –