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

时间:2016-04-14 06:40:06

标签: sql sql-server join self-join

这是我的表 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

3 个答案:

答案 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