这很简单-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
当您使用表联接时,它甚至更简单:
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;
本质上,中的子查询select
获取标量值并将其传递给主查询。子查询select
不允许传递多于一行多于一列,这是一个限制。在这里,我们将a传递count
给主查询,据我们所知,该查询将始终只是一个数字- 标量值。如果找不到值,则子查询返回null
到主查询。而且,子查询可以访问from
主查询子句中的列,如我的查询所示,该查询employee.empid
是从外部查询传递到内部查询的。
编辑 :
当在select
子句中使用子查询时,Oracle实质上将其视为左联接(您可以在查询的解释计划中看到此联接),并且行的基数仅在左边的每一行的右边。
左联接非常方便,尤其是select
由于其限制而要替换子查询时。在此,LEFT JOIN
关键字两侧的表行数没有限制。