Kodulehed
[384] - Andmebaasid I (ITI0206) (kevad 2023)
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 (16.02.2023 15:52):
Milline on tüüpiline viga LIMIT klausli kasutamisel?
Vastus (19.03.2023 17:37): LIMIT klauslit ei saa kasutada MS Accessis, kuid saab kasutada mitmes teises SQL andmebaasisüsteemis. LIMIT n võimaldab päringu tulemusest väljastada esimesed n rida. SQL standard ei näe samuti ette LIMIT klauslit. Samas saab SQL standardi kohaselt kasutada FETCH FIRST n ROWS ONLY klauslit, mis teeb sama välja kui LIMIT.

Üks ülesannete klass, kus LIMIT'it ebaõigelt kasutatakse, on kõigi nende ühte tüüpi olemite leidmine, millel mingi tunnuse väärtus on kõige suurem või kõige väiksem.

Leia ametid, millel on kõige suurem min_palk väärtus.
 
Vale. Sorteerin read minimaalse palga jälgi kahanevalt ja siis valin ridade hulgast kõige esimese.
 
SELECT amet_kood, min_palk
FROM Amet
ORDER BY min_palk DESC
LIMIT 1;

SELECT *
FROM Amet
ORDER BY palk DESC
FETCH FIRST 1 ROWS ONLY;

Õige. Leian ametid, mille minimaalne palk on kõigi minimaalsete palkade hulgast kõige suurem.
 
SELECT amet_kood, min_palk
FROM Amet
WHERE min_palk=(SELECT Max(min_palk) AS m FROM Amet);

Esimene lahendus on vale, sest võib olla mitu ametit, millel on ühtemoodi kõige suurem palk. Esimene lahendus leiab ainult ühe sellise ameti (millise, on ennustamatu). Teine leiab kõik sellised ametid.

MS Accessis oleks õige lahendus ka selline. TOP predikaat leiab minimaalse palga järgi kahanevalt sorteeritud ametite hulgast kõige esimese (e kõige suurema) minimaalse palgaga ametid.

SELECT TOP 1 amet_kood, min_palk
FROM Amet
ORDER BY min_palk DESC;

MS SQL Serveris tuleks sama tulemuse saavutamiseks kasutada TOP ... WITH TIES.

SELECT TOP 1 WITH TIES amet_kood, min_palk
FROM Amet
ORDER BY min_palk DESC;

Samuti annab õige tulemuse see päring, mis töötab näiteks PostgreSQLis. WITH TIES tagab, et vajadusel on päringu tulemuses rohkem kui üks rida.

SELECT *
FROM Amet
ORDER BY palk DESC
FETCH FIRST 1 ROWS WITH TIES;

Oluline on üle rõhutada, et TOP ja FETCH FIRST 1 ROWS WITH TIES lahendused eeldavad ridade sorteerimist - muidu on tulemus juhuslik rida.

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!