MS Access - Příkaz INNER JOIN

5. 12. 2012, Vladimír Klaus, přečteno 28154x

MS Access
SQL

Tak tímto se dají spojovat tabulky. Tedy ne fyzicky, ale třeba při použití příkazu SELECT může být výsledkem spojení tabulek. K čemu je to dobré? Tak například potřebujeme znát detailní informace o objednávce, tedy jak parametry objednávky, tak i údaje o zákazníkovi, který ji učinil.

Poznámka: V některých databázích stačí napsat pouze JOIN.

A takové informace jsou ve dvou tabulkách, které musíme spojit. Spojení musíme provést přes nějakou společnou hodnotu, což je v tomto případě ID zákazníka. V tabulce objednávek se pole jmenuje IdZakaznika a v tabulce zákazníků je to ID. Protože ale i tabulka objednávek obsahuje pole ID, musíme použít místo pouhého ID celý zápis (včetně názvu tabulky) – Zakaznici.ID. A nakonec vůbec nezaškodí (často je to dokonce nutnost), když název tabulky použijeme i u druhého sloupce - Objednavky.IdZakaznika.

SELECT * FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID

Výsledkem je krásné spojení dvou tabulek. Zároveň platí, že v tomto výsledku budou spojeny řádky pouze tehdy, pokud je v obou nalezeno stejné ID zákazníka. A naopak (zjednodušeně řečeno) – pokud existuje záznam o objednávce od neexistujícího zákazníka, nebo existuje zákazník, který si nic neobjednal, ve výsledku nebude! Porovnejte prosím s LEFT JOIN a RIGHT JOIN.

SQL obrázek

Teď si zkusíme trochu komplikovanější úkol. Zjistit, jaká je celková výše objednávek zákazníků z Prahy 8. Začneme úpravou dotazu tak, aby se nám vyfiltrovaly pouze objednávky z požadovaného města.

SELECT * FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
  WHERE Zakaznici.Mesto = "Praha 8"

SQL obrázek

A teď už můžeme využít znalosti z agregačních funkcí a vložíme sčítací funkci.

SELECT SUM(Objednavky.Castka) FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Zakaznici.Mesto = "Praha 8"

SQL obrázek

Prima, ale nás to ještě zajímá v podrobnější podobě – podle jednotlivých adres (ulic). Obohatíme dotaz o seskupení dle Ulice, ale abychom ve výsledku viděli nejen součty, ale také ty ulice, musíme přidat Ulici i do SELECTu. Poslední úpravou bude zadání aliasu pro sloupec se součtem pomocí klíčového slova AS.

SELECT SUM(Objednavky.Castka) AS Soucet, Ulice FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Zakaznici.Mesto = "Praha 8"
  GROUP BY Zakaznici.Ulice

SQL obrázek

V dalším příkladu si ukážeme, jak zjistit objednávky od uživatele Soboty, které jsou za více než 500 Kč. Samozřejmě musíme začít tím, že propojíme Zákazníky a Objednávky přes ID zákazníka. Následně přidáme dvě podmínky na částku a jméno.

SELECT Objednavky.*, Zakaznici.Prijmeni FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Objednavky.Castka > 500 AND Zakaznici.Prijmeni = "Sobota"

SQL obrázek

Poznámka: Příkaz INNER JOIN lze plnohodnotně nahradit zapsáním propojovacích podmínek do příkazu WHERE a uvedením obou tabulek za příkaz FROM.

Předchozí příklad tedy můžeme zapsat i takto:

SELECT Objednavky.*, Zakaznici.Prijmeni FROM Objednavky, Zakaznici
WHERE Objednavky.IdZakaznika = Zakaznici.ID
AND Objednavky.Castka > 500
AND Zakaznici.Prijmeni ="Sobota"