|
![]() | Strana 15 (CASE v SELECT) | ![]() | Sbírka příkladů SQL dotazů | Strana 17 (duplicity v záznamech) | ![]() |
Příklad 24
Zadání: Zjistěte, která firma má nejvyšší obrat
Popis řešení: Příklad se zdá jednodušší, než je ve skutečnosti. Musí se totiž provést dvě agregační funkce (nejprve SUM a poté z výsledku MAX).
SQL:
SELECT * FROM (SELECT SUM(Faktury.castka) AS suma,Firmy.nazev FROM Firmy, Faktury WHERE Faktury.firma=Firmy.cislo GROUP BY Firmy.nazev) WHERE suma=(SELECT MAX(suma) FROM (SELECT SUM(Faktury.castka) AS suma FROM Faktury GROUP BY Faktury.firma) )
602SQL verze 8 disponuje klauzulí LIMIT, která dotaz podstatně zjednoduší:
SQL:
SELECT SUM(Faktury.castka) AS suma,Firmy.nazev FROM Firmy, Faktury WHERE Faktury.firma=Firmy.cislo GROUP BY Firmy.nazev ORDER BY suma DESC LIMIT 1
Poznámky:
a) V příkladu je použito výběru prvního záznamu z dotazu obsahujícího firmy sestupně setříděné podle obratu.
b) Výsledkem je vždy jeden záznam, i když by dvě a více firem mělo stejný obrat. V tomto případě není definováno, která z firem bude vybrána.
Příklad 24 - ext.
Pokud bychom chtěli vytvořit editovatelný dotaz obsahující všechny informace o firmě s největším obratem, můžeme např. použít tuto konstrukci:
SQL:
SELECT * FROM (SELECT SUM(Faktury.castka) AS suma, Faktury.firma FROM Faktury GROUP BY Faktury.firma ORDER BY suma DESC LIMIT 1) As MaxObrat, Firmy WHERE Firmy.cislo=MaxObrat.firma
Poznámky:
a) První operand joinu je pomocí LIMITu vybrané číslo firmy, joinem je připojená tabulka firem
b) Použití klauzule LIMIT uvnitř subdotazu nešlo použít vždy - až po úpravě optimalizátoru ve verzi 8.1b (28) a 9.0.05.0527
![]() | Strana 15 (CASE v SELECT) | ![]() | Sbírka příkladů SQL dotazů | Strana 17 (duplicity v záznamech) | ![]() |