602SQL-Úplná dokumentace Index  

Sbírka dotazů – str. 10

Příklad 18

Zadání: Vyberte firmy, které mají faktury za více než 10000,- Kč.

Popis řešení: Zvolíme opět řešení se subdotazem. Subdotaz pro každou firmu spočte její faktury. Pak už stačí subdotaz porovnat s konstantou 10000.

SQL:

  SELECT A.nazev
  FROM Firmy A
  WHERE 10000 < (SELECT SUM(castka)
                 FROM Faktury B
                 WHERE A.cislo=B.firma)

Poznámky:

a) Zde použitý subdotaz se odlišuje od subdotazů v předešlých příkladech – pro každý záznam tabulky Firmy má subdotaz jinou hodnotu.

b) Pokud bychom chtěli vypsat tytéž firmy a jejich obraty, musíme použít variantu dotazu bez subdotazu:

  SELECT A.nazev, SUM(B.castka) AS suma
  FROM Firmy A, Faktury B
  WHERE A.cislo=B.firma
  GROUP BY B.firma
  HAVING 10000 < SUM(B.castka)

c) Všimněte si, že dotaz se subdotazem je editovatelný, zatímco dotaz s propojením nikoliv. Navíc tento dotaz není napsán podle normy SQL (za SELECT může stát jen výraz z GROUP BY nebo agregační funkce) a to, že jej lze přeložit, je rozšíření 602SQL serveru, se kterým je ale nutné pracovat opatrně - v tomto příkladu má smysl použít jméno firmy místo čísla firmy, protože víme, že si odpovídají 1:1 (že nejsou duplicity v názvech firmy). Aby dotaz splňoval normu, muselo by se upravit GROUP BY na:

  GROUP BY B.firma,A.nazev

d) Obdobný výsledek lze získat také s využitím subdotazu ve FROM:

  SELECT nazev, suma
  FROM Firmy A JOIN (SELECT firma,SUM(castka) AS suma
                     FROM Faktury B
                     GROUP BY B.firma)
             ON (A.cislo=B.firma)
  WHERE 10000 < suma

e) Obdobný výsledek lze získat také s využitím subdotazu v SELECT, pro omezení je však třeba tentýž subselect použít i ve WHERE:

  SELECT A.nazev, (SELECT SUM(castka)
                    FROM Faktury B
                    WHERE A.cislo=B.firma) AS suma
  FROM Firmy A
  WHERE (SELECT SUM(castka)
         FROM Faktury B
         WHERE A.cislo=B.firma) > 10000