自我加入条件

时间:2016-05-13 17:06:50

标签: sql sql-server self-join

我对自我加入条件感到困惑 例如:我有一张名为' employee'和列为employeeid,name,managerid 只是一个基本语法

select e.employeeid,m.managerid
from employee e
left join employee m
**on e.managerid=m.employeeid
or e.employeeid=m.managerid**

请告诉我**中的文字与

之间的差异

2 个答案:

答案 0 :(得分:0)

我认为您的查询开头是错误的 - 现在您获得员工的员工ID和经理的经理ID。所以你正在跳过“一代”

我想你想要:

select e.employeeid, m.employeeid
from employee e
left join employee m
on e.managerid=m.employeeid

这将为您提供第一列中的员工ID以及第二列中的经理ID。

第二个是相反的:

select e.employeeid, m.employeeid
from employee e
left join employee m
on e.employeeid=m.managerid

会在第一列中为您提供经理ID,在第二列中为您提供员工的ID。在这种情况下,交换me别名更有意义,假设它们代表manageremployee,但这不会改变结果。

答案 1 :(得分:0)

你的第一部分

e.managerid=m.employeeid

将获得您的下属员工

和第二部分

e.employeeid=m.managerid

会得到你的经理。

在你的查询中选择m.managerid并没有多大意义..如果你查看这个示例数据并查询它可能对你更有意义。

CREATE TABLE employee (
     employeeid INT,
     managerid INT
    )
INSERT  INTO employee
VALUES  (1,NULL),
        (2,1),
        (3,1),
        (4,2),
        (5,4);

SELECT  e.employeeid employee,
        m.employeeid relatedemployee,
        CASE WHEN e.managerid = m.employeeid THEN 'manager'
             ELSE 'employee'
        END AS relationship
FROM    employee e
        LEFT JOIN employee m ON e.managerid = m.employeeid
                                OR e.employeeid = m.managerid

output:

employee    relatedemployee relationship
----------- --------------- ------------
1           2               employee
1           3               employee
2           1               manager
2           4               employee
3           1               manager
4           2               manager
4           5               employee
5           4               manager