我正在学习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
还可以用来列出没有经理的员工。