我已经四处寻找解释,关于 select 语句中的子查询如何工作,但由于解释非常模糊,我仍然无法理解这个概念。
我想知道您如何在 oracle 的 select 语句中使用子查询以及它究竟输出什么。
例如,如果我有一个查询想要显示员工的姓名以及他们从这些表中管理的个人资料数量
员工(EmpName,EmpId)
配置文件(配置文件 ID,...,EmpId)
如何使用子查询?
我想在 select 语句中需要一个子查询来实现 group by 函数来计算每个员工管理的配置文件的数量,但我不太确定。
最佳答案
这很简单-
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
中的子查询不允许通过超过一行和超过一列,这是一个限制。在这里,我们传递了一个 count
到主查询,正如我们所知,它始终只是一个数字——一个标量值。如果没有找到值,子查询返回 null
到主查询。此外,子查询可以访问来自 from
的列。主查询的子句,如我的查询 where employee.empid
所示从外部查询传递到内部查询。编辑:
当您在
select
中使用子查询时子句,Oracle 本质上将其视为左连接(您可以在查询的 explain plan 中看到这一点),对于左侧的每一行,行的基数只是右侧的一个。左连接说明
左连接非常方便,尤其是当您想替换
select
时。子查询由于其限制。这里对LEFT JOIN
两边的表的行数没有限制。关键词。更多信息请阅读 Oracle Docs on subqueries和 left join or left outer join .
关于sql - oracle中select语句中的子查询是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557899/