| An Instance S3 of Sailors | R2 of Reserves | B1 of Boats | |||||||||
| sid | sname | rating | age | sid | bid | day | bid | bname | color | ||
| 22 | Dustin | 7 | 45.0 | 22 | 101 | 10/10/98 | 101 | Interlake | blue | ||
| 29 | Brutus | 1 | 33.0 | 22 | 102 | 10/10/98 | 102 | Interlake | red | ||
| 31 | Lubber | 8 | 55.5 | 22 | 103 | 10/8/98 | 103 | Clipper | green | ||
| 32 | Andy | 8 | 25.5 | 22 | 104 | 10/7/98 | 104 | Marine | red | ||
| 58 | Rusty | 10 | 35.0 | 31 | 102 | 11/10/98 | |||||
| 64 | Horatio | 7 | 35.0 | 31 | 103 | 10/6/98 | |||||
| 71 | Zorba | 10 | 16.0 | 31 | 104 | 11/12/98 | |||||
| 74 | Horatio | 9 | 35.0 | 64 | 101 | 9/5/98 | |||||
| 85 | Art | 3 | 25.5 | 64 | 102 | 9/8/98 | |||||
| 95 | Bob | 3 | 63.5 | 74 | 103 | 9/8/98 | |||||
| SELECT S.sname FROM Sailors AS S, Reserves AS R WHERE S.sid = R.sid AND R.bid = 103; |
SELECT S.sname FROM Sailors AS S WHERE S.sid IN (SELECT R.sid FROM Reserves AS R WHERE R.bid = 103); |
SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid = 103 AND R.sid = S.sid); |
| SELECT DISTINCT S.sname FROM Sailors S, Reserves R, Boats B WHERE S.sid = R.sid AND R.bid = B.bid AND B.color='red'; |
SELECT DISTINCT S.sname FROM Sailors AS S WHERE S.sid IN (SELECT R.sid FROM Reserves AS R WHERE R.bid IN (SELECT B.bid FROM Boats B WHERE B.color = 'red')); |
| SELECT B.color FROM Sailors S, Reserves R, Boats B WHERE S.sid = R.sid AND R.bid = B.bid AND S.sname='Lubber'; |
SELECT B.color FROM Boats B WHERE B.bid IN (SELECT R.bid FROM Reseves R WHERE R.sid IN (SELECT S.sid FROM Sailors S WHERE S.sname='Lubber')); |
| SELECT DISTINCT S.sid, S.sname FROM Sailors S, Reserves R WHERE S.sid = R.sid; |
SELECT DISTINCT S.sid, S.sname FROM Sailors S WHERE S.sid IN (SELECT DISTINCT R.sid FROM Reserves R); |
SELECT DISTINCT S.sid, S.sname FROM Sailors S WHERE EXISTS (SELECT R.sid FROM Reserves R WHERE S.sid = R.sid); |
| SELECT DISTINCT S.sname,
S.sid FROM Sailors AS S, Reserves AS R, Boats AS B WHERE S.sid = R.sid AND R.bid = B.bid AND (B.color = 'red' OR B.color = 'green'); |
SELECT S.sname, S.sid FROM Sailors S, Reserves R, Boats B WHERE S.sid = R.sid AND R.bid = B.bid AND B.color = 'red' UNION SELECT S2.sname, S2.sid FROM Sailors S2, Reserves R2, Boats B2 WHERE S2.sid = R2.sid AND R2.bid = B2.bid AND B2.color = 'green'; |
| SELECT DISTINCT S.sname FROM Sailors S, Reserves R1, Boats B1, Reserves R2, Boats B2 WHERE S.sid = R1.sid AND R1.bid =B1.bid AND S.sid = R2.sid AND R2.bid = B2.bid AND B1.color = 'red' AND B2.color = 'green'; |
Use INTERSECT instead of UNION |
| SELECT S.sname FROM Sailors AS S WHERE NOT EXISTS (SELECT B.bid FROM Boats B WHERE B.bid NOT IN(SELECT R.bid FROM Reserves R WHERE R.sid = S.sid)); |
SELECT S.sname FROM Sailors AS S WHERE S.sid IN ( SELECT DISTINCT R.sid FROM Reserves R WHERE R.sid NOT IN (SELECT DISTINCT R1.sid FROM Reserves AS R1, Boats AS B WHERE B.bid NOT IN ( SELECT R2.bid FROM Reserves R2 WHERE R1.sid = R2.sid ))); |
SELECT DISTINCT S.sname, S.sid
FROM Sailors S, Reserves R, Boats B
WHERE S.sid = R.sid AND B.bname = 'Interlake' AND NOT EXISTS (SELECT sid,
bid
FROM Reserves R1
WHERE R.sid = R1.sid AND B.bid = R1.bid );
How to solve?
1.
|
2.
|
3. Cross Product
|
||||||||||||||||||||||||||||||||||
| SELECT DISTINCT R.sid, B.bid FROM Reserves R, Boats B WHERE B.bname = 'Interlake'; |
||||||||||||||||||||||||||||||||||||
4.
|
5. Difference
|
6. Join with Sailors to get sname. | ||||||||||||||||||||||||||||||||||
| SELECT DISTINCT R.sid, B.bid FROM Reserves R, Boats B WHERE B.bname = 'Interlake' AND NOT EXISTS (SELECT sid, bid FROM Reserves R1 WHERE R.sid = R1.sid AND B.bid = R1.bid ); |
||||||||||||||||||||||||||||||||||||