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

时间:2013-12-13 02:08:05

标签: sql oracle select group-by subquery

我一直在寻找一个解释,一个select语句中的子查询如何工作,但由于解释非常模糊,我仍然无法理解这个概念。

我想知道如何在oracle中的select语句中使用子查询以及它输出的确切内容。

例如,如果我有一个想要显示员工姓名的查询以及他们从这些表中管理的配置文件数

员工(EmpName,EmpId)

个人资料(ProfileId,...,EmpId)

如何使用子查询?

我认为select语句中需要子查询来实现按功能分组来计算每个员工管理的配置文件的数量,但我不太确定。

2 个答案:

答案 0 :(得分:22)

这很简单 -

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 subqueriesleft join or left outer join

答案 1 :(得分:0)

在Oracle RDBMS中,只要将(子)输出封装为集合,就可以在select子句中使用多行子查询。特别是,多行select子句子查询可以将其每一行输出为封装在xmlforest中的xmlelement。