我正在学习SQL,并且遇到了一个需要self-join的问题。我一直在玩查询,以了解为什么self-join桌子以它的方式放置它,但没有很多运气

Create table Departments (DepartmentID int primary key, Name text);

insert into Departments values
(1001,'SRO'),
(2001,'Drs'),
(3001,'Accounting');

Create table Employees 
(
  EmployeeID int not null, 
  DepartmentID int not null,
  ManagerID int,
  Name varchar(50) not null,
  Salary int not null,
  primary key(EmployeeID),
  foreign key (DepartmentID)
    references Departments(DepartmentID)
 );

insert into Employees values
(68319,1001,NULL,'Kayling','6000.00'),
(66928,3001,68319,'Blaze','2750.00'),
(67832,1001,68319,'Clare','2550.00'),
(65646,2001,68319,'Jonas','2957.00'),
(67858,2001,65646,'Scarlet','3100.00'),
(69062,2001,65646,'Frank','3100.00'),
(63679,2001,69062,'Sandrine','900.00'),
(64989,3001,66928,'Adelyn','1700.00'),
(65271,3001,66928,'Wade','1350.00');

现在执行两个查询,以了解桌子最初的样子以及self-join之后的内容

查询1

select * from Employees order by Employeeid;

查询2

select * from Employees e1 
join Employees e2 on
e2.ManagerID = e1.EmployeeID
order by e1.employeeid;

我得到的结果是:

查询1

EmployeeID  DepartmentID    ManagerID   Name        Salary
63679       2001            69062       Sandrine    900
64989       3001            66928       Adelyn      1700
65271       3001            66928       Wade        1350
65646       2001            68319       Jonas       2957
66928       3001            68319       Blaze       2750
67832       1001            68319       Clare       2550
67858       2001            65646       Scarlet     3100
68319       1001            null        Kayling     6000
69062       2001            65646       Frank       3100

查询2结果

EmployeeID  DepartmentID    ManagerID   Name    Salary  EmployeeID  DepartmentID    ManagerID   Name        Salary
65646       2001            68319       Jonas   2957    69062       2001            65646       Frank       3100
65646       2001            68319       Jonas   2957    67858       2001            65646       Scarlet     3100
66928       3001            68319       Blaze   2750    65271       3001            66928       Wade        1350
66928       3001            68319       Blaze   2750    64989       3001            66928       Adelyn      1700
68319       1001            null        Kayling 6000    67832       1001            68319       Clare       2550
68319       1001            null        Kayling 6000    66928       3001            68319       Blaze       2750
68319       1001            null        Kayling 6000    65646       2001            68319       Jonas       2957
69062       2001            65646       Frank   3100    63679       2001            69062       Sandrine    900

现在,我对第二列上的查询二的理解仅显示ManagerID,而不是其他任何人(例如,工作人员)。

这种类型的自加入应该让我找到由每个经理管理的所有员工(staff)。新的联接表如何记住,第一个薪水列与经理有关,而最后一次与员工有关。表中没有智能,而是在查询中,例如E1和E1?

分析解答

您的查询列表经理及其相关员工,您需要倒数情况:

select e1.*, e2.*
from Employees e1 
left join Employees e2 on e1.ManagerID = e2.EmployeeID
order by e1.employeeid;

left join还可以用来列出没有经理的员工。

demo在这里