查看(现已停用)文档并找到此示例:
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
。已有Id
列
Employees
表,ManagerId
对于经理来说是空的(好吧,它想成为一个笑话)。我的意见:
编辑:感谢所有贡献者的回答!
@Alex K。:这是我的观点"它不是人们实际使用的东西"。但是,想要学习SQL的人可能会认为这是一种很好的做法,因为它存在于此处的文档中
@Nebi:非常感谢你能更简单地写出来得到相同的结果
@Unnikrishnan R:"展示子查询的工作原理"在我看来,这不仅仅意味着它是完全正常的,而且是有意义的。如果我让事情变得更简单,那么为什么要这么做呢
@me:应该标题为"让我们讨论一下sql文档"或者那样;)
答案 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
列 表
首先,ManagerId
和Id
是表Employees
的不同列。所以它们之间存在差异。但是您可能会遇到子查询Id
的{{1}}和联接表Managers
的{{1}}。
然后您需要定义您正在使用的Id
。否则你会得到ambigiuos列的错误。在此示例中,您可以指定Employees
的子查询Id
或联接表Id
(Managers.Id
)的Id
。您选择哪一个完全不相同,因为您使用Employees
一个Employees.Id
。
为什么额外的
INNER JOIN
对于经理来说是空的(好吧它想要 是个笑话。)
这是因为让所有员工都不是经理。你说这可以更容易或以其他形式完成,你说得对。例如:
Id
这可能与原始结果相同。但是这个例子与此无关,它与子查询的结构有关。
答案 2 :(得分:0)
为什么要使用额外的ManagerId。 Id列已在Employees表
中考虑您正在拥有一个员工表,并且您还想将经理信息保存在同一个表中。除了ID列之外,您还需要添加另一列来保留经理人。
为什么额外的ManagerId对于经理来说是空的(好吧它想成为一个笑话)。
查询只是为了展示子查询的工作原理。在这种情况下,子查询从Employee
表(managerID is null
)中检索管理器,然后在外部查询中将这些id与Employee
表连接起来,以获得每个管理器的工资。