sql - oracle中select语句中的子查询是如何工作的

标签 sql oracle select group-by subquery

我已经四处寻找解释,关于 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 subqueriesleft join or left outer join .

关于sql - oracle中select语句中的子查询是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557899/

相关文章:

sql - MySQL bool 全文搜索中的 "Show all except"

mysql - 仅当在其他表中找到时才返回 mysql 结果集

sql - oracle在选择内部调用存储过程

mysql - 从选择 Zend 框架左连接

mysql - 包含数据库信息的表

mysql - 我可以使用稍后在查询中选择的列吗?

c# - ASP.NET 和 Oracle 存储过程错误

java - 无法将连接转换为 oracle.jdbc.OracleConnection

postgresql - Postgres 条件查询 - 将一个字符串与其他几个字符串进行比较的最佳实践

MySQL 在设定时间内查询事务