Det är enkelt-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Det är ännu enklare när du använder en tabellkoppling så här:
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;
Förklaring till underfrågan:
I huvudsak en underfråga i en select
får ett skalärt värde och skickar det till huvudfrågan. En underfråga i select
får inte passera mer än en rad och mer än en kolumn, vilket är en begränsning. Här skickar vi ett count
till huvudfrågan, som, som vi vet, alltid bara skulle vara ett tal - ett skalärt värde. Om ett värde inte hittas returnerar underfrågan null
till huvudfrågan. Dessutom kan en underfråga komma åt kolumner från from
klausul i huvudfrågan, som visas i min fråga där employee.empid
skickas från den yttre frågan till den inre frågan.
Redigera :
När du använder en underfråga i en select
Oracle behandlar den i huvudsak som en vänsterkoppling (du kan se detta i förklaringsplanen för din fråga), med kardinaliteten för raderna bara en till höger för varje rad till vänster.
Förklaring till vänsteranslutningen
En vänsterkoppling är väldigt praktisk, speciellt när du vill ersätta select
delfråga på grund av dess begränsningar. Det finns inga begränsningar här för antalet rader i tabellerna på vardera sidan av LEFT JOIN
nyckelord.
För mer information läs Oracle Docs om delfrågor och vänsterkoppling eller vänster yttre koppling.