|
Strana 9 (subdotaz) | Sbírka příkladů SQL dotazů | Strana 11 (SELECT subdotaz, COUNT DISTINCT) |
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
Strana 9 (subdotaz) | Sbírka příkladů SQL dotazů | Strana 11 (SELECT subdotaz, COUNT DISTINCT) |