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?

Postitas Erki Eessaar 16.06.2021 13:13
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.

Väärtuste masssiivi näide PostgreSQL andmebaasis

Väärtuste

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!