繁体   English   中英

select语句中的子查询如何在oracle中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM