Je to jednoduché-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Je to ještě jednodušší, když použijete spojení tabulky takto:
SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;
Vysvětlení dílčího dotazu:
V podstatě poddotaz v select
získá skalární hodnotu a předá ji hlavnímu dotazu. Dílčí dotaz v select
nesmí projít více než jedním řádkem a více než jedním sloupcem, což je omezení. Zde předáváme count
na hlavní dotaz, který, jak víme, by byl vždy pouze číslo- skalární hodnota. Pokud hodnota není nalezena, poddotaz vrátí null
na hlavní dotaz. Navíc může poddotaz přistupovat ke sloupcům z from
klauzule hlavního dotazu, jak je ukázáno v mém dotazu, kde employee.empid
je předán z vnějšího dotazu do vnitřního dotazu.
Upravit :
Když použijete poddotaz v select
klauzule, Oracle s tím v podstatě zachází jako s levým spojením (můžete to vidět v plánu vysvětlení pro váš dotaz), přičemž mohutnost řádků je pouze jeden napravo pro každý řádek vlevo.
Vysvětlení levého spojení
Levé spojení je velmi užitečné, zvláště když chcete nahradit select
poddotaz kvůli jeho omezením. Neexistují zde žádná omezení počtu řádků tabulek na obou stranách LEFT JOIN
klíčové slovo.
Další informace naleznete v části Oracle Docs o dílčích dotazech a levém spojení nebo levém vnějším spojení.