选择语句中的子查询如何在 oracle 中工作
Posted
技术标签:
【中文标题】选择语句中的子查询如何在 oracle 中工作【英文标题】:How does Subquery in select statement work in oracle 【发布时间】:2013-12-31 17:08:13 【问题描述】:我已经到处寻找解释,选择语句中的子查询如何工作,但由于解释非常模糊,我仍然无法理解这个概念。
我想知道你是如何在 oracle 的 select 语句中使用子查询的,它究竟输出了什么。
例如,如果我有一个查询想要显示员工的姓名以及他们从这些表中管理的个人资料的数量
雇员(EmpName, EmpId)
个人资料(ProfileId, ..., EmpId)
如何使用子查询?
我想在 select 语句中需要一个子查询来实现按功能分组来计算每个员工管理的配置文件的数量,但我不太确定。
【问题讨论】:
【参考方案1】:很简单-
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 本质上将其视为左连接(您可以在查询的explain plan 中看到这一点),行的基数只是右侧的一个左边的每一行。
左连接说明
左连接非常方便,尤其是当您想替换 select
子查询时,因为它的限制。这里对LEFT JOIN
关键字两边的表格行数没有限制。
更多信息请阅读Oracle Docs on subqueries和left join or left outer join。
【讨论】:
非常感谢!这真的很有帮助。一个问题。您说子查询不允许传递多于一列,这意味着如果我想添加一个 SUM 函数,我将不得不使用另一个子查询?或者是否可以在选择中有多个子查询? 是的。您可以在选择列表中使用多个子查询。您必须使用另一个子查询来添加 SUM 函数。 重要的是,如果连接表中有几行匹配,则用连接替换子查询可能会导致不同的结果。关于加入 w3schools.com/sql/sql_join.asp 的很好解释【参考方案2】:在 Oracle RDBMS 中,只要将(子)输出封装为集合,就可以在 select 子句中使用多行子查询。特别是,多行选择子句子查询可以将其每一行输出为封装在 xmlforest 中的 xmlelement。
【讨论】:
以上是关于选择语句中的子查询如何在 oracle 中工作的主要内容,如果未能解决你的问题,请参考以下文章