Vinnaren i pepparkakshustävlingen!
2018-01-05, 10:20
  #1
Medlem
Hej!
Här har jag en liten fråga angående strukturen på queryn man utformar:

Student(id, name, address, city, birthYear)
Course(code, courseName, lengthWeeks, institution°)
Institution(instNr, instName, instCity)
Takes(id°, code°)

Which students (list names, addresses) live in Paris and take the Databases
course?

t1 ← σ city=Uppsala (Student)
t2 ← t1 ⋈ Takes
t3 ← t2 ⋈ Course
t4 ← σ courseName=Databases (t3)
R ← π name, address (t4)

Ovanstående är facits svar, men jag svarade följande:

t1 ← σ courseName=Databases (course)
t2 ← t1 ⋈ Takes
t3 ← t2 ⋈ Student
t4 ← σ city=Uppsala (t3)
R ← π name, address (t4)

Visst borde svaret bli samma?
__________________
Senast redigerad av rudimentarperson 2018-01-05 kl. 10:34.
Citera
2018-01-10, 08:35
  #2
Medlem
fnirps avatar
Möjligtvis får båda frågorna fram studenter som bor i Uppsala, men det är inte vad som efterfrågas :-)

Nu är jag ingen relationsalgebraexpert, det var det hundra år sedan jag pysslade med... Men om jag grottar ner mig i din lösning:

t1 = lista på code för kursen Databases
t2 = lista på id som tar kursen Databases
t3 = lista på alla studenter som tar kursen Databases
t4 = lista på alla studenter som tar kursen Databases och som bor i Uppsala
R = Presentera namn och adress på dessa studenter

Så, svaret är ja, det borde bli samma svar i båda fallen.

Personligen skulle jag väl beta av det i samma ordning som facit om det var en skoluppgift. Varför? Jo, för att det är lättare att se till att man får med alla krav. Hoppar man runt, så är det lätt att missa.

Däremot, skulle det här vara en riktig query mot en riktig databas, skulle det förmodligen se ut så som du skrev den. Då vill jag koppla ihop tabellerna från den minsta tabellen till den största (och förhoppningsvis är antalet studenter fler, än antalet kurser som erbjuds).

SELECT s.name, s.address
FROM Course c
INNER JOIN Takes t ON c.code = t.code
INNER JOIN Student s ON t.id = s.id
WHERE c.courseName = 'Databases'
AND s.city = 'Paris'

Det har oftast ingen praktiskt betydelse idag med moderna databasmotorer som bygger om frågan till något mer optimalt, men vissa principer lever kvar sedan förr för min del. Att hålla de interna resultatset:en minimala.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback