To proste-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Jest to jeszcze prostsze, gdy używasz takiego dołączania do stołu:
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;
Wyjaśnienie podzapytania:
Zasadniczo podzapytanie w select
pobiera wartość skalarną i przekazuje ją do głównego zapytania. Podzapytanie w select
nie może przekazywać więcej niż jednego wiersza i więcej niż jednej kolumny, co jest ograniczeniem. Tutaj przekazujemy count
do zapytania głównego, które, jak wiemy, zawsze byłoby tylko liczbą – wartością skalarną. Jeśli wartość nie zostanie znaleziona, podzapytanie zwraca null
do głównego zapytania. Co więcej, podzapytanie może uzyskać dostęp do kolumn z from
klauzula głównego zapytania, jak pokazano w moim zapytaniu, gdzie employee.empid
jest przekazywany z zapytania zewnętrznego do zapytania wewnętrznego.
Edytuj :
Kiedy używasz podzapytania w select
Oracle zasadniczo traktuje to jako sprzężenie lewostronne (możesz to zobaczyć w planie wyjaśniania zapytania), przy czym liczność wierszy to tylko jeden po prawej stronie dla każdego wiersza po lewej stronie.
Wyjaśnienie lewego sprzężenia
Lewe sprzężenie jest bardzo przydatne, zwłaszcza gdy chcesz zastąpić select
podzapytanie ze względu na jego ograniczenia. Nie ma tu ograniczeń co do liczby wierszy tabel po obu stronach LEFT JOIN
słowo kluczowe.
Aby uzyskać więcej informacji, przeczytaj Oracle Docs na temat podzapytań i lewego sprzężenia lub lewego sprzężenia zewnętrznego.