只是移动列名后不太理解查询

Not quite understanding the query after just shifting column names

这是我的 table tblEmployee ,当我尝试使用自连接查询时,结果在移动列时会发生变化,有人可以向我解释一下两者之间的区别 queries.Thanks

EmployeeID  Name    ManagerID
 1          Mike     3
 2          Rob      1
 3          Todd    NULL
 5          Ben      1
 6          Sam      1

Query_1

SELECT E.Name AS Employee, M.Name AS Manager
from tblEmployee E
LEFT JOIN tblEmployee M
on E.ManagerID = M.EmployeeID  

输出

Employee    Manager
 Mike        Todd
 Rob         Mike
 Todd        NULL
 Ben         Mike
 Sam         Mike

QUERY_2

SELECT E.Name AS Employee, M.Name AS Manager
from tblEmployee E
LEFT JOIN tblEmployee M
on E.EmployeeID = M.ManagerID  

输出

Employee  Manager
Mike       Rob
Mike       Ben
Mike       Sam
Rob        NULL
Todd       Mike
Ben        NULL
Sam        NULL

对于 Query1,您将选择每个员工 (E) 及其经理 (M)(如果有)(左连接)。

使用 Query2 您将其反转。您正在选择每个员工 (E) 及其下属 (M)。 M.Name 的别名现在不正确,因为它不是经理而是下属。由于有些员工有多个下属,因此每个人列出一次(Mike)。

首先是一个简单的解释:左连接获取第一个 table 中至少与第二个 table 中所选列匹配的每一行。

第一个查询 中,您正在考虑每一行的 经理 ID 并在 上寻找匹配项第二个 table 中的员工 ID:因为第二个 table 中的值(员工 ID)是 key(至少在示例定义中),您只能找到与该 ID 匹配的一行。

例如:第一行 Mike 有 Manager ID = 3,当您查看 table 时,您只有一行有 Employee ID = 3,也就是Todd

第二个查询 中,您正在考虑每一行的 员工 ID 并在 上寻找匹配项第二个 table 中的经理 ID:由于可能有多个行具有相同的 经理 ID,每一行您将获得更多价值。

例如:第一行 Mike 有 Employee ID = 1,当您查看 table 时,您有三行 anager ID = 1,他们是 Rob、Ben 和 Sam。

从某种意义上说,第二个查询基本上没有什么问题,因为您已经交换了连接条件列,您得到

all combination of manager name followed by the employee name they are manager of

与给您的第一个查询不同

all combination of employee names followed by their manager name

所以您更正后的查询 2 应该是

SELECT E.Name AS Manager, M.Name AS Employee -- note changes here
from tblEmployee E
LEFT JOIN tblEmployee M
on E.EmployeeID = M.ManagerID  

输出

Manager Employee

Mike       Rob
Mike       Ben
Mike       Sam
Rob        NULL
Todd       Mike
Ben        NULL
Sam        NULL

或者您可能想要相反的结果

那么您的查询应该使用 RIGHT JOIN 而不是 LEFT JOIN

SELECT E.Name AS Employee, M.Name AS Manager
from tblEmployee E
RIGHT JOIN tblEmployee M -- note the change in JOIN
on E.EmployeeID = M.ManagerID  

输出

Employee Manager

 Todd        Mike   
 Mike        Rob    
 NULL        Todd   
 Mike        Ben    
 Mike        Sam