Kodulehed
[381] - Andmebaasid II (ITI0207) (sügis 2021)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / PostgreSQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne (16.06.2021 13:13):
Kuidas leida päringuga koondandmed, kus iga olemi kohta on üks rida ning selles reas on massiiv selle olemiga otseselt või kaudselt seotud olemite andmetest?
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.

vaata ka faile:
Väärtuste masssiivi näide PostgreSQL andmebaasis[58 KB]

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!