Vastus: See, kas seda saab üldse SQLiga lahendada ja kuidas seda lahendada sõltub andmebaasisüsteemist.
Järgnev näide on tehtud PostgreSQLis. Oletame, et andmebaasi kontseptuaalne struktuur on:
[Hotell]-1------0..*-[Ruum]-1-----------0..*-[Reserveerimine]-0..*-------1-[Külaline]
Ülesandeks on leida kõik hotellid ja näidata päringu tulemuses iga hotelli kohta üht rida. Selles reas peavad olema ka andmed seotud ruumide, reserveerimiste ja külaliste kohta.
WITH res AS (SELECT ruumi_nr, hotelli_nr, array_agg(row(kylalise_nr, perenimi, alguse_aeg, lopu_aeg) ORDER BY alguse_aeg, kylalise_nr) AS reserveerimised
FROM Reserveerimine INNER JOIN Kylaline USING (kylalise_nr)
GROUP BY ruumi_nr, hotelli_nr),
ruumid AS (SELECT Ruum.ruumi_nr, Ruum.hotelli_nr, ruumi_tyyp, hind, reserveerimised
FROM Ruum LEFT JOIN Res USING ( ruumi_nr, hotelli_nr))
SELECT Hotell.hotelli_nr, nimi, linn, array_agg(row(ruumi_nr, ruumi_tyyp, hind, reserveerimised) ORDER BY ruumi_nr) AS ruumid
FROM Hotell LEFT JOIN ruumid USING (hotelli_nr)
GROUP BY Hotell.hotelli_nr, nimi, linn
ORDER BY hotelli_nr;
Päring leiab kõik hotellid. Iga hotelli kohta esitatakse selle hotelli ruumide massiiv. Massiivi elementideks on read, kus ühes väljas olevaks väärtuseks on selles ruumis toimunud reserveerimiste ridade massiiv.
PostgreSQLis on koondandmete massiivide leidmiseks funktsioon
array_agg. Funktsiooni
row kasutatakse rea konstrueerimiseks.
Päringu tulemuse näide on vastusele lisatud failis.