Kodulehed
[386] - Andmebaasid I (ITI0206) (kevad 2024)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid
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 / SQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Erki Eessaar:
Mis vahe on MS Accessi SQL mägimurrakus DISTINCT ja DISTINCTROW määrangutel?
Vastus:

SQL standard kirjeldab DISTINCT, kuid mitte DISTINCTROW (st viimane on andmebaasisüsteemi-spetsiifiline leiutis).

Leidke külaliste perenimed nii, et kordused on eemaldatud. Esitage perenimed suurtähtedega. Sorteerige päringu tulemuses perenimed tähestikulisele järjekorrale vastupidises järjekorras.

Õige:

SELECT DISTINCT Ucase(perenimi) AS perenimi
FROM Külaline
ORDER BY Ucase(perenimi) DESC;

SELECT Ucase(perenimi) AS perenimi
FROM Külaline
GROUP BY perenimi
ORDER BY Ucase(perenimi) DESC;

Õpetlik on, et ORDER BY klauslisse tuleb kirjutada ORDER BY Ucase(perenimi) DESC, mitte ORDER BY perenimi DESC;

Kuigi MS Access lubaks ORDER BY lauses kirjutada ka ORDER BY perenimi DESC, siis PostgreSQL ja Oracle tahavad ka seal funktsiooni poole pöördumist (NB! PostgreSQL ja Oracle andmebaasisüsteemides on see funktsioon nimega Upper, mitte Ucase). Pealegi on see ülesande mõttes loogilisem – sorteerida tuleks nende andmete alusel, mis kasutajale esitatakse.

Kui ma ei taha ORDER BY klauslisse funktsiooni poole pöördumist kirjutada, siis võin vormistada lahenduse mitmeosaliselt, kus kõigepealt leitakse suurtähtedega erinevad perenimed ja siis sorteeritakse tulemust.

SELECT perenimi
FROM (SELECT DISTINCT Ucase(perenimi) AS perenimi
FROM Külaline) AS erinevad_perenimed
ORDER BY perenimi DESC;

Vale:

SELECT DISTINCTROW Ucase(perenimi) AS perenimi
FROM Külaline
ORDER BY perenimi DESC;

DISTINCTROW ignoreeritakse, kui andmeid küsitakse vaid ühest tabelist või on vaja väljastada andmed kõikidest FROM klauslis nimetatud tabelite veergudest. Viide.

Veel üks näide.

Leidke vähemalt ühe reserveerimise teinud külaliste erinevad perenimed. Päringu tulemuses on iga perenimi üks kord.

SELECT DISTINCT perenimi
FROM Külaline INNER JOIN Reserveerimine ON Külaline.külalise_nr = Reserveerimine.külalise_nr;

Leidke vähemalt ühe reserveerimise teinud külalised. Väljastage igaühe kohta tema perenimi. Kui leidub rohkem kui üks sama perenimega külaline, kes on teinud vähemalt ühe reserveerimise, siis on see perenimi päringu tulemuses mitmekordselt.

SELECT DISTINCTROW perenimi
FROM Külaline INNER JOIN Reserveerimine ON Külaline.külalise_nr = Reserveerimine.külalise_nr;

DISTINCTROW vaatleb korduste eemaldamiseks tervet tabeli rida, mitte ainult päringu tulemuses väljastatavaid andmeid. DISTINCTROW pole SQL standardis ja on MS Accessi-spetsiifiline kontsruktsioon (seda ei toeta isegi MS Accessi vanem vend – MS SQL Server). Alternatiiv selle kasutamisele:

SELECT perenimi
FROM Külaline
WHERE EXISTS (SELECT * FROM Reserveerimine WHERE Külaline.külalise_nr = Reserveerimine.külalise_nr);

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!