1 | --- 1a
|
---|
2 | --- Note: RTRIM is used to remove trailing whitespace
|
---|
3 | SELECT S.sname
|
---|
4 | FROM Sportsman S
|
---|
5 | WHERE RTRIM(sname) LIKE 'S%m%e';
|
---|
6 |
|
---|
7 | --- 1b
|
---|
8 | SELECT S.sname
|
---|
9 | FROM Sportsman S, Coaches T
|
---|
10 | WHERE S.sid = T.sid AND S.sage > 23;
|
---|
11 |
|
---|
12 |
|
---|
13 | --- 1c
|
---|
14 | SELECT C.cname
|
---|
15 | FROM Coach C, Coaches T, Sportsman S
|
---|
16 | WHERE C.cid = T.cid AND
|
---|
17 | T.sid = S.sid AND
|
---|
18 | C.ccountry = S.scountry AND
|
---|
19 | C.cage < ( SELECT MAX( C2.cage )
|
---|
20 | FROM Coach C2);
|
---|
21 |
|
---|
22 | --- 1d
|
---|
23 | SELECT S.sname, C.cname
|
---|
24 | FROM Sportsman S, Coach C, Coaches T
|
---|
25 | WHERE S.sid = T.sid AND
|
---|
26 | T.cid = C.cid AND
|
---|
27 | ABS(S.sage - C.cage) < 10;
|
---|
28 |
|
---|
29 | --- 1e1
|
---|
30 | SELECT UNIQUE C.cname
|
---|
31 | FROM Coach C, Coaches T1, Coaches T2
|
---|
32 | WHERE C.cid = T1.cid AND
|
---|
33 | T1.cid = T2.cid AND
|
---|
34 | NOT T1.sid = T2.sid;
|
---|
35 |
|
---|
36 | --- 1e2
|
---|
37 | SELECT C.cname
|
---|
38 | FROM Coach C
|
---|
39 | WHERE C.cid = ( SELECT T.cid
|
---|
40 | FROM Coaches T
|
---|
41 | WHERE T.cid = C.cid
|
---|
42 | GROUP BY T.cid
|
---|
43 | HAVING COUNT(*) > 1 );
|
---|
44 |
|
---|
45 | --- 1f
|
---|
46 | SELECT C.cname
|
---|
47 | FROM Coach C
|
---|
48 | WHERE C.cid IN ( SELECT T.cid
|
---|
49 | FROM Coaches T, Sportsman S
|
---|
50 | WHERE T.sid = S.sid AND S.scountry = 'nl') AND
|
---|
51 | C.cid IN ( SELECT T2.cid
|
---|
52 | FROM Coaches T2, Sportsman S2
|
---|
53 | WHERE T2.sid = S2.sid AND S2.scountry = 'de'
|
---|
54 | GROUP BY T2.cid
|
---|
55 | HAVING COUNT(*) = 1);
|
---|
56 |
|
---|
57 | --- 1g
|
---|
58 | SELECT C.cname
|
---|
59 | FROM Coach C
|
---|
60 | WHERE C.cid IN ( SELECT T.cid
|
---|
61 | FROM Coaches T, Sportsman S
|
---|
62 | WHERE T.sid = S.sid AND S.scountry = 'nl'
|
---|
63 | GROUP BY T.cid
|
---|
64 | HAVING COUNT(*) = 1) AND
|
---|
65 | C.cid NOT IN ( SELECT T2.cid
|
---|
66 | FROM Coaches T2, Sportsman S2
|
---|
67 | WHERE T2.sid = S2.sid AND S2.scountry = 'de');
|
---|
68 |
|
---|
69 | --- 1h
|
---|
70 | SELECT C.cname C
|
---|
71 | FROM Coach C
|
---|
72 | WHERE C.cid NOT IN ( SELECT T.cid
|
---|
73 | FROM Coaches T, Sportsman S
|
---|
74 | WHERE T.sid = S.sid AND S.scountry = 'fr');
|
---|
75 |
|
---|
76 | --- 1i
|
---|
77 | SELECT C.cname C
|
---|
78 | FROM Coach C
|
---|
79 | WHERE C.cid IN ( SELECT T.cid
|
---|
80 | FROM Coaches T, Sportsman S
|
---|
81 | WHERE T.sid = S.sid AND S.scountry != 'fr');
|
---|
82 |
|
---|
83 | --- 2a
|
---|
84 | SELECT R.Branch, S.sname, R.NumHours
|
---|
85 | FROM Sleep R, Sportsman S, (SELECT R2.Branch, MAX(R2.NumHours) AS max
|
---|
86 | FROM Sleep R2
|
---|
87 | GROUP BY R2.Branch) SleepB
|
---|
88 | WHERE S.sid = R.sid AND R.Branch = SleepB.Branch AND R.NumHours = SleepB.max;
|
---|
89 |
|
---|
90 |
|
---|
91 | --- 2b
|
---|
92 | SELECT S.sname, Person.avg AS avg_sleep, Person2Branch.Branch
|
---|
93 | FROM Sportsman S, (SELECT R.Branch, AVG(R.NumHours) AS avg
|
---|
94 | FROM Sleep R
|
---|
95 | GROUP BY R.Branch) Branch,
|
---|
96 | (SELECT DISTINCT R2.sid, R2.Branch
|
---|
97 | FROM Sleep R2) Person2Branch,
|
---|
98 | (SELECT R3.sid, AVG(R3.NumHours) AS avg
|
---|
99 | FROM Sleep R3
|
---|
100 | GROUP BY R3.sid) Person
|
---|
101 | WHERE S.sid = Person.sid AND
|
---|
102 | S.sid = Person2Branch.sid AND
|
---|
103 | Person2Branch.Branch = Branch.Branch AND
|
---|
104 | Person.avg < Branch.avg;
|
---|
105 |
|
---|
106 |
|
---|
107 | --- 3a
|
---|
108 | --- nothing done, when deleting a country from Members
|
---|
109 | DROP TABLE Votes;
|
---|
110 | DROP TABLE Members;
|
---|
111 | CREATE TABLE Members(
|
---|
112 | name char(20),
|
---|
113 | status char(20) NOT NULL,
|
---|
114 | PRIMARY KEY ( name ),
|
---|
115 | CHECK( (status = 'permanent') OR (status = 'elected') )
|
---|
116 | );
|
---|
117 |
|
---|
118 | CREATE TABLE Votes(
|
---|
119 | res char(20),
|
---|
120 | country char(20),
|
---|
121 | vote char(20) NOT NULL,
|
---|
122 | PRIMARY KEY ( res, country ),
|
---|
123 | FOREIGN KEY ( country ) REFERENCES Members( name ),
|
---|
124 | CHECK( (vote = 'yes') OR ( vote = 'no' ) OR ( vote = 'abstrain' ) )
|
---|
125 | );
|
---|
126 |
|
---|
127 |
|
---|
128 | --some bogus data
|
---|
129 | INSERT INTO Members VALUES ('dk', 'elected' );
|
---|
130 | INSERT INTO Members VALUES ('nl', 'elected' );
|
---|
131 | INSERT INTO Members VALUES ('de', 'permanent' );
|
---|
132 | INSERT INTO Members VALUES ('en', 'permanent' );
|
---|
133 | INSERT INTO Members VALUES ('fr', 'permanent' );
|
---|
134 |
|
---|
135 | INSERT INTO Votes VALUES ('oud', 'nl', 'no' );
|
---|
136 | INSERT INTO Votes VALUES ('oud', 'dk', 'yes' );
|
---|
137 | INSERT INTO Votes VALUES ('oud', 'en', 'yes' );
|
---|
138 | INSERT INTO Votes VALUES ('nieuw', 'nl', 'yes' );
|
---|
139 | INSERT INTO Votes VALUES ('oud', 'de', 'no' );
|
---|
140 | INSERT INTO Votes VALUES ('oud1', 'de', 'no' );
|
---|
141 |
|
---|
142 | SELECT V.res
|
---|
143 | FROM Votes V
|
---|
144 | GROUP BY V.res
|
---|
145 | HAVING 0 = ( SELECT COUNT(*)
|
---|
146 | FROM Votes V2, Members M
|
---|
147 | WHERE V.res = V2.res AND
|
---|
148 | V2.country = M.name AND
|
---|
149 | M.status = 'permanent' AND
|
---|
150 | V2.vote = 'no' ) AND
|
---|
151 | 14 < ( SELECT COUNT(*)
|
---|
152 | FROM Votes V3
|
---|
153 | WHERE V3.res = V.res AND
|
---|
154 | V3.vote = 'yes');
|
---|
155 |
|
---|
156 | ---3c
|
---|
157 | --this is not a correct answer, cause it don't give value to countries with no veto votes, but it lists all the 'permanent countries'
|
---|
158 | SELECT M.name, Vote.veto
|
---|
159 | FROM Members M, ( SELECT V.country, Count (*) AS veto
|
---|
160 | FROM Votes V
|
---|
161 | WHERE V.vote = 'no'
|
---|
162 | GROUP BY V.country
|
---|
163 | ) Vote
|
---|
164 | WHERE M.status = 'permanent' AND M.name = Vote.country (+) ;
|
---|
165 |
|
---|