Det er enkelt-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Det er endnu nemmere, når du bruger en table join som denne:
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;
Forklaring på underforespørgslen:
Grundlæggende er en underforespørgsel i en select
får en skalarværdi og sender den til hovedforespørgslen. En underforespørgsel i select
må ikke passere mere end én række og mere end én kolonne, hvilket er en begrænsning. Her sender vi en count
til hovedforespørgslen, der, som vi ved, altid kun ville være et tal - en skalarværdi. Hvis en værdi ikke findes, returnerer underforespørgslen null
til hovedforespørgslen. Desuden kan en underforespørgsel få adgang til kolonner fra from
klausul i hovedforespørgslen, som vist i min forespørgsel, hvor employee.empid
overføres fra den ydre forespørgsel til den indre forespørgsel.
Rediger :
Når du bruger en underforespørgsel i en select
klausul, behandler Oracle det i det væsentlige som en venstre joinforbindelse (du kan se dette i forklaringsplanen for din forespørgsel), hvor kardinaliteten af rækkerne kun er én til højre for hver række i venstre.
Forklaring på venstre joinforbindelse
En venstre join er meget praktisk, især når du vil erstatte select
underforespørgsel på grund af dens begrænsninger. Der er ingen begrænsninger her på antallet af rækker i tabellerne på begge sider af LEFT JOIN
søgeord.
For mere information læs Oracle Docs om underforespørgsler og venstre join eller venstre outer join.