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í.