Domeinmodellering-Opdracht/2 Activiteiten/Uitwerkingen/SQL-toets-blok-b Vorig jaar
Uitwerkingen SQL-toets blok B
Beste medestudenten, zoals jullie weten is op BlackBoard een proef-toets te vinden voor de toets van aanstaande donderdag (1 Oktober 2009) Het leek me een goed idee om hieronder de antwoorden te zetten zodat je altijd even kunt controleren of je 't goed hebt of niet. Mocht je commentaar hebben op een antwoord geef dan dit net zoals je doet bij reflecties.
Dit zijn dus mijn (Tim Cooijmans) antwoorden, wat dus geen garantie geeft op het juiste antwoord!!! (Sterker nog ik verwacht niet dat alles goed is)
Vraag 1
<source lang='sql'> SELECT a.state_born, COUNT(*)*4 FROM president AS a, administration as B WHERE a.pres_name = b.pres_name GROUP BY a.state_born HAVING COUNT(*) >= ALL (
SELECT COUNT(*) FROM president, administration WHERE president.pres_name = administration.pres_name GROUP BY president.state_born )
</source>
Ik heb deze query samengesteld met de aanname dat elke administration 4 jaar heeft geduurd. Ik heb geen idee of ik deze aanname mag doen of dat er iets anders wordt verwacht... | ||
Tim Cooijmans → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Volgens mij klopt deze niet Tim. De vraag is volgens mij eigenlijk om te geven welke staat het meeste aantal jaren een president in het witte huis heeft gehad. In de tabel president staat een kolom YRS_SERV. Dit geeft dus al het aantal jaren. Met groeperen op state is het dus mogelijk om per state te kijken hoeveel jaar de president uit die state kwam. Vervolgens enkel het maximum selecteren. Ik heb hem als volgt gemaakt... | ||
Koen Derks → Domeinmodellering-Opdracht | Remove this comment when resolved! |
<source lang='sql'> SELECT state_born, SUM(yrs_serv) FROM president GROUP BY state_born HAVING SUM(yrs_serv) >= ALL (
SELECT SUM(yrs_serv) FROM president GROUP BY state_born )
</source>
Ik hoor graag van jou of andere of mijn opvatting van de vraag en de query klopt... | ||
Koen Derks → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Volgens mij klopt deze ja, al zou je er nog rekening mee kunnen houden dat het witte huis pas in 1800 af was, en de eerste president al in 1789 in dienst trad, maar ik denk niet dat dat echt de bedoeling is. | ||
Stan Philipsen → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Je hebt gelijk Koen, dat ziet er beter uit. Ik had al zo'n vermoeden dat mijn query niet klopte... | ||
Tim Cooijmans → Domeinmodellering-Opdracht | Remove this comment when resolved! |
{{{3}}} | ||
Sjors Gielen → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Vraag 2
<source lang='sql'> SELECT a.state_name, MAX(a.year_entered) FROM state AS a, president AS b WHERE b.state_born = a.state_name GROUP BY a.state_name HAVING max(a.year_entered) = (
SELECT max(year_entered) FROM state WHERE state_name = ANY ( SELECT state_born FROM president ) )
</source>
Deze klopt volgens mij wel..ik had wel een andere manier, dus voor de geïnteresseerden... | ||
Koen Derks → Domeinmodellering-Opdracht | Remove this comment when resolved! |
<source lang='sql'>
SELECT state_name, year_entered
FROM state
WHERE state_name IN (
SELECT state_born FROM president) GROUP BY state_name, year_entered HAVING year_entered >= ALL ( SELECT year_entered FROM state WHERE state_name IN ( SELECT state_born FROM president) )
</source>
Nog een extra subquery, maar het werkt wel (volgens mij althans)... | ||
Koen Derks → Domeinmodellering-Opdracht | Remove this comment when resolved! |
<source lang='sql'>
SELECT state_name, year_entered
FROM STATE
WHERE year_entered = (
SELECT max(year_entered) FROM STATE, PRESIDENT WHERE STATE.STATE_NAME = PRESIDENT.STATE_BORN )
</source>
Iets korter, en maar één subquery | ||
Stan Philipsen → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Ik had 'm nog eens iets anders. Ik zou graag horen waar die van mij met de anderen verschilt. Ik heb in ieder geval geen join gebruikt, wel drie subqueries: | ||
Sjors Gielen → Domeinmodellering-Opdracht | Remove this comment when resolved! |
<source lang='sql'> SELECT state_name, year_entered FROM state WHERE state_name IN (SELECT DISTINCT state_born FROM president) AND year_entered >= ALL(
SELECT year_entered FROM state WHERE state_name IN (SELECT DISTINCT state_born FROM president)
) </source>
{{{3}}} | ||
Sjors Gielen → Domeinmodellering-Opdracht | Remove this comment when resolved! |
{{{3}}} | ||
Jodocus Deunk → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Alleen heeft LIMIT 1 hetzelfde probleem als die ik boven bij 1 al noemde bij mijn alternatieve oplossing... Je hebt altijd maar 1 resultaat, ook al kloppen er meer met de vraagstelling. Er staat niet voor niets "is (of zijn...)" ;) | ||
Sjors Gielen → Jodocus Deunk | Remove this comment when resolved! |
Vraag 3
<source lang='sql'> SELECT a.candidate, b.party FROM election AS a, president AS b WHERE a.candidate = b.pres_name AND a.winner_loser_indic = 'W' AND EXISTS (
SELECT * FROM election AS c WHERE a.election_year = c.election_year AND c.votes > a.votes )
</source>
{{{3}}} | ||
Patrick Schileffski → Domeinmodellering-Opdracht | Remove this comment when resolved! |
{{{3}}} | ||
Jodocus Deunk → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Vraag 4
<source lang='sql'> SELECT a.pres_name FROM pres_hobby AS a WHERE a.hobby = 'Riding' AND 2 = (
SELECT COUNT(*) FROM pres_hobby AS b WHERE b.pres_name = a.pres_name )
</source>
{{{3}}} | ||
Erik Boss → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Vraag 5
<source lang='sql'> SELECT a.pres_name, a.state_born, COUNT(*) FROM president AS a, pres_marriage AS b WHERE a.pres_name = b.pres_name AND a.pres_name NOT IN (
SELECT pres_name FROM pres_hobby )
GROUP BY a.pres_name, a.state_born UNION SELECT a.pres_name, a.state_born, 0 FROM president AS a WHERE a.pres_name NOT IN (
SELECT pres_name FROM pres_hobby )
AND a.pres_name NOT IN (
SELECT pres_name FROM pres_marriage )
</source>
Volgens mij klopt deze query en ik kan ook geen betere query bedenken | ||
Patrick Schileffski → Tim Cooijmans | Remove this comment when resolved! |
Voor de tweede keer zorgen dat de pres_name niet in pres_hobby voorkomt is overbodig, dat heb je in het bovenste deel ook al gedaan. Voor de rest kan ik ook geen beter antwoord bedenken. | ||
Erik Boss → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Het in de tweede deel van de union kijken dat pres_name niet in pres_hobby voorkomt heeft wel degelijk nut, als je dat niet doet geef je namelijk presidenten weer die wél een hobby hebben maar niet getrouwt zijn. Geen idee of die er met de huidige data zijn maar dat is wel degelijk wat anders dan gevraagd word. | ||
Tim Cooijmans → Domeinmodellering-Opdracht | Remove this comment when resolved! |
Patrick Schileffski → Domeinmodellering-Opdracht | Remove this comment when resolved! |
In algemene zin hebben jullie inderdaad gelijk, mijn fout. Nou blijkt inderdaad wel dat het voor dit specifieke geval niet uitmaakt, ze geven dezelfde results. | ||
Erik Boss → Domeinmodellering-Opdracht | Remove this comment when resolved! |