[英]How does Subquery in select statement work in oracle
我一直在寻找一个解释,一个select语句中的子查询如何工作,但由于非常含糊的解释,我仍然无法理解这个概念。
我想知道如何在oracle中的select语句中使用子查询以及它输出的确切内容。
例如,如果我有一个想要显示员工姓名的查询以及他们从这些表中管理的配置文件数
员工(EmpName,EmpId)
个人资料(ProfileId,...,EmpId)
我如何使用子查询?
我认为在select语句中需要一个子查询来实现按功能分组来计算每个员工管理的配置文件的数量,但我不太确定。
这很简单-
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
子句访问列,如我的查询中所示,其中employee.empid
从外部查询传递到内部查询。
编辑 :
当您在select
子句中使用子查询时,Oracle基本上将其视为左连接(您可以在查询的解释计划中看到这一点),左侧每行的行的基数只有一个。
左连接的说明
左连接非常方便,尤其是当您由于其限制而要替换select
子查询时。 这里对LEFT JOIN
关键字两侧的表行数没有限制。
有关更多信息,请阅读子查询上的Oracle Docs以及左连接或左外连接 。
在Oracle RDBMS中,只要将(子)输出封装为集合,就可以在select子句中使用多行子查询。 特别是,多行select子句子查询可以将其每一行输出为封装在xmlforest中的xmlelement。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.