Autor Zpráva
Hrdlodus
Profil
Zdravím, chtěl bych porozumět práci s více tabulkami, ale nepodařilo se mi zformulovat dotaz tak, abych odpověď našel na Googlu. (A nemusel číst odbornou publikaci. (A mohl si být jistý, že jsem něco špatně nepochopil při samostatném zkoušení.))

Jak je to s tím, kdy musím specifikovat tabulku a kdy je to zbytečné?

Příklad:
SELECT t2.id FROM druha t2
  WHERE t2.id NOT IN
    (SELECT t1.id FROM hlavni t1
       WHERE t2.id = t1.id)
  AND t2.id IS NOT NULL

Takhle vypadá minimalistická verze? (A když někde přidám t1 nebo t2, tak již to bude pouze kvůli přehlednosti?)

SELECT id FROM druha t2 // Chápal bych to takto: id ze druhé tabulky.
WHERE id NOT IN // Pracuji s tím id, které vybírám - ze druhé tabulky.
(SELECT id FROM hlavni // Id z hlavní tabulky, protože zde z ní vybírám.
WHERE id = t2.id) // Id z hlavní tabulky, protože jsem v selectu, který pracuje s hlavní tabulkou. Ale id z druhé tabulky již musím specifikovat, že je z druhé tabulky, jinak by se srovnávalo id z první tabulky samo se sebou.
AND id IS NOT NULL // Id ze druhé tabulky, protože je to pokračování prvního WHERE, který se vztahuje k úvodnímu selectu vybírajícím ze druhé tabulky.

Plus: Jestli to funguje na všech databázových systémech stejně (MySQL vs. Informix apod.).

(Pro informaci - vysvětlení SELECTu:
t1.id je PK
t2.id je FK - přes to id je t2 navázaná na t1 (id není PK pro t2)
Popis selectu: Chci vybrat ta id z druhé tabulky, která se nevyskytují v první tabulce. Ale pouze ta, která ve druhé tabulce nejsou NULL. WHERE v poddotazu je pro snížení počtu vybraných id.)
juriad
Profil
Ten dotaz lze napsat ekvivalentně přehledněji (alespoň mi to tak přijde):
SELECT t2.id
FROM druha t2
LEFT JOIN hlavni t1 ON t2.id = t1.id
WHERE t1.id IS NULL AND t2.id IS NOT NULL
Motivace pro tento dotaz: položím tabulky vedle sebe (spáruji jejich záznamy) a pak si podmínkou vyberu ty správné kombinace.

Budeš se divit, ale ta podmínka ve vnitřním dotazu ho rapidně zhoršuje (je to závislý dotaz, který se provádí pro každý řádek t2 znovu).

Mimochodem, t2.id není cizí klíč, protože ten by ti tuto situaci nepovolil vytvořit. Je to nanejvíš vazební sloupec.
Cizí klíč (jako constraint FOREIGN KEY) vynucuje, aby v odkázané tabulce daná hodnota existovala.

Pokud uvedeš název sloupce, tak se použije ten, který je v první tabulce, která ho obsahuje počítáno zevnitř a následně zleva.
Napřed se tedy hledá v aktuálním (pod)*dotazu, následně v nadřazených dotazech a na každé úrovni se hledá od prvního zmíněného.

Aliasy (tabulek) se používají z několika důvodů:
- vnitřní dotaz v klauzuli FROM musí mít přiřazené jméno
- pokud potřebuješ použít jednu tabulku v dotazu několikrát
- pokud z vnitřního dotazu potřebuješ přistoupit k sloupci tabulky ve vnějším dotazu (! pozor, obvykle neefektivní)
- pokud jsi líný psát celý název tabulky (v tvém případě bych volil aliasy h a d
Samozřejmě můžeš každé tabulce přidat unikátní jednoznakový alias, pak je krásně vidět, o který sloupec se jedná.
Hrdlodus
Profil
Děkuji!
Za vše.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: