我是SQL的新手。我只知道基本的查询,但不深入。我搜索了必需的自连接,找到了this question
大多数答案都说它对引用同一个表很有用。
查询示例如下:
Select e1.employeeName
from employee e1, employee e2
where e1.employeeid = e2.supervisorid;难道我们不能通过使用
select employeeName
from employee
where employeeid = supervisorid;或者是自连接,但写作方式不同?如果我理解错了,请告诉我。
发布于 2015-05-14 00:47:18
select employeeName
from employee
where employeeid = supervisorid;会给你员工的名字,他是自己的主管。这是行不通的。另一个查询实际上应该是
Select e1.employeeName as employee, e2.employeeName as supervisor
from employee e1
left join employee e2 on e1.supervisorid = e2.employeeid;为了让知道的名字,员工和主管的名字。
发布于 2015-05-14 00:47:51
在您链接的示例中,有问题的表包含对其自身的引用。对于这个特定的示例,它是一个员工列表,其中一些员工是其他员工的主管。由于只有一个表,而不是主管表和非主管表,因此非主管使用自联接来引用行中的主管。
如果员工是自己的主管,则第二个查询将仅返回结果。
发布于 2015-05-14 00:48:42
自联接的定义是与自身联接的表。第一个查询有一个拼写错误。它应该是
Select e1.employeeName
from employee e1, employee e2
where e1.employeeid = e2.supervisorid;注意where子句中的e2。更正后,第一个查询将为您提供每个主管员工的姓名。
第二个查询将给出每个员工的姓名,这些员工是他们自己的主管。很可能是一套空的。
为了帮助您理解它,请看下面的示例:
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;将返回:
Medium Boss Big Boss
Worker Bee Medium Boss您可以创建一个类似的解决方案,使用2个表,一个用于员工,另一个用于主管。
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并将您的查询编写为:
Select e.employeeName, s.supervisorName
from supervisors s, employees e
where s.supervisorId = e.supervisorId它还将返回:
Medium Boss Big Boss
Worker Bee Medium Boss但是,您将为主管复制员工数据,因为他们中的大多数人也是员工。
https://stackoverflow.com/questions/30220759
复制相似问题