首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们什么时候需要自连接?

我们什么时候需要自连接?
EN

Stack Overflow用户
提问于 2015-05-14 00:43:54
回答 6查看 1.9K关注 0票数 4

我是SQL的新手。我只知道基本的查询,但不深入。我搜索了必需的自连接,找到了this question

大多数答案都说它对引用同一个表很有用。

查询示例如下:

代码语言:javascript
复制
Select e1.employeeName
     from employee e1, employee e2
     where e1.employeeid = e2.supervisorid;

难道我们不能通过使用

代码语言:javascript
复制
select employeeName
       from employee
       where employeeid = supervisorid;

或者是自连接,但写作方式不同?如果我理解错了,请告诉我。

EN

回答 6

Stack Overflow用户

发布于 2015-05-14 00:47:18

代码语言:javascript
复制
select employeeName
from employee
where employeeid = supervisorid;

会给你员工的名字,他是自己的主管。这是行不通的。另一个查询实际上应该是

代码语言:javascript
复制
Select e1.employeeName as employee, e2.employeeName as supervisor
from employee e1
left join employee e2 on e1.supervisorid = e2.employeeid;

为了让知道的名字,员工和主管的名字。

票数 1
EN

Stack Overflow用户

发布于 2015-05-14 00:47:51

在您链接的示例中,有问题的表包含对其自身的引用。对于这个特定的示例,它是一个员工列表,其中一些员工是其他员工的主管。由于只有一个表,而不是主管表和非主管表,因此非主管使用自联接来引用行中的主管。

如果员工是自己的主管,则第二个查询将仅返回结果。

票数 1
EN

Stack Overflow用户

发布于 2015-05-14 00:48:42

自联接的定义是与自身联接的表。第一个查询有一个拼写错误。它应该是

代码语言:javascript
复制
Select e1.employeeName
     from employee e1, employee e2
     where e1.employeeid = e2.supervisorid;

注意where子句中的e2。更正后,第一个查询将为您提供每个主管员工的姓名。

第二个查询将给出每个员工的姓名,这些员工是他们自己的主管。很可能是一套空的。

为了帮助您理解它,请看下面的示例:

代码语言:javascript
复制
table employee

employeeId supervisorId employeeName
1          null         Big Boss
2          2            Medium Boss
3          3            Worker Bee

select e1.employeeName, e2.employeeName
     from employee e1, employee e2
     where e1.employeeid = e2.supervisorid;

将返回:

代码语言:javascript
复制
 Medium Boss Big Boss
 Worker Bee  Medium Boss

您可以创建一个类似的解决方案,使用2个表,一个用于员工,另一个用于主管。

代码语言:javascript
复制
Table employee
employeeId employeeName SupervisorId
1          Big Boss     null
2          Medium Boss  1
3          Worker Bee   2

table supervisors
supervisorId supervisorName
1            Big Boss
2            Medium Boss

并将您的查询编写为:

代码语言:javascript
复制
Select e.employeeName, s.supervisorName 
   from supervisors s, employees e
   where s.supervisorId = e.supervisorId

它还将返回:

代码语言:javascript
复制
 Medium Boss Big Boss
 Worker Bee  Medium Boss

但是,您将为主管复制员工数据,因为他们中的大多数人也是员工。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30220759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档