602SQL-Úplná dokumentace Index  

Sbírka dotazů – str. 11

Příklad 19

Zadání: Vypište názvy firem (a případně částku), které mají alespoň jednu fakturu za více než 5000,- Kč.

Popis řešení: V tomto příkladu ukážeme použití subdotazu v části SELECT. Subdotaz pro každé číslo faktury vrátí jméno firmy. Toto jméno lze použít ve výčtu sloupců dotazu.

SQL:

  SELECT DISTINCT (SELECT nazev
                   FROM Firmy
                   WHERE Firmy.cislo=Faktury.firma) AS Nazev
  FROM Faktury
  WHERE castka > 5000

Poznámky:

a) Sloupec Nazev odpovědi není samozřejmě editovatelný.

b) Stejného výsledku (s možností editace odpovědi) lze dosáhnout takto (Příkl_19a):

  SELECT Firmy.nazev 
  FROM Firmy
  WHERE Firmy.cislo =ANY (SELECT Faktury.firma
                          FROM Faktury
                          WHERE castka > 5000
    AND Faktury.firma=Firmy.cislo)

c) Stejného výsledku lze dosáhnout i bez subdotazů, pomocí JOINu, např. takto (Příkl_19b):

  SELECT DISTINCT Firmy.nazev 
  FROM Faktury,Firmy
  WHERE (castka > 5000)
    AND (Firmy.cislo=Faktury.firma)

d) Stejného výsledku lze dosáhnout také takto (Příkl_19c):

  SELECT DISTINCT Firmy.nazev 
  FROM Firmy, (SELECT firma,castka
               FROM Faktury
               WHERE castka > 5000)
  WHERE Faktury.firma=Firmy.cislo

Zadání: Pokud by nám ve stejném příkladě stačil jen počet firem, je třeba použít funkce COUNT. Otázkou zůstává umístění klauzule DISTINCT:

  SELECT DISTINCT COUNT(Firmy.nazev) 

nedá správný výsledek, je třeba před DISTINCT předřadit COUNT, tj. počítat jen unikátní firmy (Příkl_19d):

  SELECT COUNT (DISTINCT Firmy.nazev) 
  FROM Faktury,Firmy
  WHERE (castka > 5000)
    AND (Firmy.cislo=Faktury.firma)