首页 > 解决方案 > 自联接数据变化 SQL Server

问题描述

我有一个Employee包含名称和经理 ID 的表,因此我使用自联接来查找员工的经理。

我的表结构和表数据:

CREATE TABLE Employee
(
    EmployeeID INT PRIMARY KEY,
    Name NVARCHAR(50),
    ManagerID INT
)

INSERT INTO Employee
    SELECT 1, 'Mike', 3
    UNION ALL
    SELECT 2, 'David', 3
    UNION ALL
    SELECT 3, 'Roger', NULL
    UNION ALL
    SELECT 4, 'Mary', 2
    UNION ALL
    SELECT 5, 'Joseph',2
    UNION ALL
    SELECT 7, 'Ben',2

选择所有数据

SELECT * 
FROM Employee

输出是:

在此处输入图像描述

现在当我使用这个查询时:

 SELECT e1.Name, e2.NAME AS 'mngrname'
 FROM Employee e1
 INNER JOIN Employee e2 ON e1.EmployeeID = e2.ManagerID

我得到的数据如下:

在此处输入图像描述

现在,当我将查询更改为:

SELECT e1.Name, e2.NAME AS 'mngrname'
FROM Employee e1
INNER JOIN Employee e2 ON e1.ManagerID = e2.EmployeeID

输出是:

在此处输入图像描述

问题;为什么会这样?为什么数据会发生变化?

标签: sql-serverjoinself-join

解决方案


SELECT e1.Name, e2.NAME AS 'mngrname'
 FROM Employee e1
 INNER JOIN Employee e2 ON e1.EmployeeID = e2.ManagerID

在这里您可以找到e1's manager.In join,因为两个表都相同,所以它是 Self join。在此连接中,别名e1Employeetable 并且e2managertable。

现在和现在e1.Name_Employee namee2.Namemanager

现在您还可以将别名 e1 作为经理表,将别名 e2 作为员工表。在这种情况下,它们将产生相同的结果,但列名将包含不同的信息。

SELECT e1.Name, e2.NAME AS 'mngrname'
FROM Employee e1
INNER JOIN Employee e2 ON e1.ManagerID = e2.EmployeeID

这里 e1 是经理表,e2 是员工表。

现在和现在e1.Name_manager namee2.NameEmployee


推荐阅读