这是我的表 tblEmployee ,当我尝试使用自我加入查询时,它的结果会因换列而变化,有人可以解释一下这些之间的区别吗两个查询。谢谢
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
答案 0 :(得分:1)
使用 Query1 ,您选择每个员工(E)及其经理(M)(如果有)(左连接)。
使用 Query2 ,你反驳了这一点。您正在选择每个员工(E)及其下属(M)。 M.Name
的别名现在不正确,因为它不是经理而是下属。由于一些员工有一个以上的下属,他们每个人都列出一次(迈克)。
答案 1 :(得分:1)
首先是一个简单的解释:左连接使第一个表中的每一行至少在您选择的列的第二个表中匹配。
在第一次查询中,您正在考虑每一行上的经理ID ,并在第二个表中查找员工ID 的匹配项:由于第二个表中的值(员工ID )是 键 (至少在示例定义中),您只能找到一行与该ID匹配。
例如:第一行Mike的经理ID = 3,当您查看表时,您只有一行员工ID = 3,那是托德
在第二个查询中,您正在考虑每一行上的员工ID ,并在第二个表中查找 Manager ID 上的匹配项:由于可能有多个具有相同 Manager ID 的行,因此每行会收到更多值。
例如:第一行Mike有员工ID = 1,当您查看表时,您有三行 anager ID = 1且那些是Rob,Ben和萨姆。
答案 2 :(得分:1)
基本上第二个查询在某种意义上很小,因为你已经交换了连接条件列,你得到了
经理姓名的所有组合,后跟员工姓名,他们是
的经理
不同于给你的第一个查询
员工姓名的所有组合,后跟经理姓名
所以你纠正的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