FROM子句中的子查询

时间:2016-09-20 10:21:24

标签: sql

查看(现已停用)文档并找到此示例:

  

FROM子句

中的子查询      

FROM子句中的子查询的行为类似于在执行查询期间生成的临时表,之后会丢失。

SELECT Managers.Id, Employees.Salary
FROM (
  SELECT Id
  FROM Employees
  WHERE ManagerId IS NULL
) AS Managers
JOIN Employees ON Managers.Id = Employees.Id

(摘自Subqueries - Subquery in FROM clause。原始作者为Phrancis。归档详情可在contributor page上找到。来源已在CC BY-SA 3.0下获得许可,可在Documentation archive中找到3}}。参考主题ID:1030和示例ID:3327。) 功能

我的问题是:

  • 为什么要使用额外的ManagerId。已有IdEmployees表,
  • 为什么额外的ManagerId对于经理来说是空的(好吧,它想成为一个笑话)。

我的意见:

  • 尽管有赞成票,但这是一个错误的例子,
  • 带有示例数据的表格很容易看到它是如何工作的。一个表有启动数据,一个表临时SELECT和一个表 结果集。

编辑:感谢所有贡献者的回答!
@Alex K。:这是我的观点"它不是人们实际使用的东西"。但是,想要学习SQL的人可能会认为这是一种很好的做法,因为它存在于此处的文档中 @Nebi:非常感谢你能更简单地写出来得到相同的结果 @Unnikrishnan R:"展示子查询的工作原理"在我看来,这不仅仅意味着它是完全正常的,而且是有意义的。如果我让事情变得更简单,那么为什么要这么做呢 @me:应该标题为"让我们讨论一下sql文档"或者那样;)

3 个答案:

答案 0 :(得分:1)

让我们考虑一种情况,其中Employee表包含所有员工,包括员工拥有Id的经理,还有经理Id的列(可以为null)。这可以是观点,谁在编写SQL查询。 例如,

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

为什么额外的ManagerId对于经理来说是空的 -  让那些不是经理的员工

答案 1 :(得分:0)

这只是一个如何执行/使用子查询的示例。 对你的问题:

  

为什么要使用额外的ManagerId。 Employees中已有Id列   表

首先,ManagerIdId是表Employees的不同列。所以它们之间存在差异。但是您可能会遇到子查询Id的{​​{1}}和联接表Managers的{​​{1}}。

然后您需要定义您正在使用的Id。否则你会得到ambigiuos列的错误。在此示例中,您可以指定Employees的子查询Id或联接表IdManagers.Id)的Id。您选择哪一个完全不相同,因为您使用Employees一个Employees.Id

  

为什么额外的INNER JOIN对于经理来说是空的(好吧它想要   是个笑话。)

这是因为让所有员工都不是经理。你说这可以更容易或以其他形式完成,你说得对。例如:

Id

这可能与原始结果相同。但是这个例子与此无关,它与子查询的结构有关。

答案 2 :(得分:0)

  • 为什么要使用额外的ManagerId。 Id列已在Employees表

    考虑您正在拥有一个员工表,并且您还想将经理信息保存在同一个表中。除了ID列之外,您还需要添加另一列来保留经理人。

  • 为什么额外的ManagerId对于经理来说是空的(好吧它想成为一个笑话)。

    查询只是为了展示子查询的工作原理。在这种情况下,子查询从Employee表(managerID is null)中检索管理器,然后在外部查询中将这些id与Employee表连接起来,以获得每个管理器的工资。

    < / LI>