É simples-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
É ainda mais simples quando você usa uma junção de tabela assim:
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;
Explicação para a subconsulta:
Essencialmente, uma subconsulta em um
select
obtém um valor escalar e o passa para a consulta principal. Uma subconsulta em select
não é permitido passar mais de uma linha e mais de uma coluna, o que é uma restrição. Aqui, estamos passando um count
para a consulta principal, que, como sabemos, sempre seria apenas um número - um valor escalar. Se um valor não for encontrado, a subconsulta retornará null
para a consulta principal. Além disso, uma subconsulta pode acessar colunas do from
cláusula da consulta principal, conforme mostrado na minha consulta onde employee.empid
é passado da consulta externa para a consulta interna. Editar :
Quando você usa uma subconsulta em um
select
cláusula, o Oracle essencialmente a trata como uma junção à esquerda (você pode ver isso no plano de explicação da sua consulta), com a cardinalidade das linhas sendo apenas uma à direita para cada linha à esquerda. Explicação para a junção esquerda
Uma junção à esquerda é muito útil, especialmente quando você deseja substituir o
select
subconsulta devido às suas restrições. Não há restrições aqui no número de linhas das tabelas em ambos os lados do LEFT JOIN
palavra-chave. Para obter mais informações, leia o Oracle Docs sobre subconsultas e junção esquerda ou junção externa esquerda.