602SQL-Úplná dokumentace Index  

Sbírka dotazů – str. 16

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