只是移动列名后不太理解查询
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
这是我的 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