Sql 如何找到在其经理之前加入其部门的员工的EMPID

Sql 如何找到在其经理之前加入其部门的员工的EMPID,sql,oracle,Sql,Oracle,我想找出在他们的经理之前加入的员工。我怎样才能解决这个问题? 我的模式如下 Employee (EmpId, DeptId,MgrId,Salary, DateOfJoining) 第一个解决方案:- 第二种解决方案:- 您需要一个自联接来执行此操作 SELECT e.* --* to return all details, if needed FROM Employee e LEFT JOIN Employee m ON e.MgrId = m.Empid WHERE m.Empid is

我想找出在他们的经理之前加入的员工。我怎样才能解决这个问题? 我的模式如下

Employee (EmpId, DeptId,MgrId,Salary, DateOfJoining)
第一个解决方案:-

第二种解决方案:-


您需要一个自联接来执行此操作

SELECT e.*  --* to return all details, if needed
FROM Employee e
LEFT JOIN Employee m ON e.MgrId = m.Empid
WHERE m.Empid is not null
AND e.DateofJoining < m.DateOfJoining;
或者,您可以使用内部联接来执行此操作-

SELECT e.*  --* to return all details, if needed
FROM Employee e
INNER JOIN Employee m ON e.MgrId = m.Empid AND e.DateofJoining < m.DateOfJoining;
将WHERE子句条件放入联接中的区别在于,联接只会在满足条件的情况下发生,而不是在1条件上联接然后过滤。就我个人而言,我尽量少做这件事。

问题是:在经理面前显示所有加入的员工

答案是:

SELECT E1.ENAME FROM EMP E1,EMP E2 
WHERE E1.MGR=E2.EMPNO 
AND E1.MGR < E2.MGR;

使用select语句执行此操作。当前查询有什么问题?它似乎给出了正确的输出,至少如果你只对直接经理感兴趣,而不是对层次结构中的所有经理感兴趣,那就是经理的经理刚刚得到了solnn的人……如果我错了,请纠正我。@SOaddict也许我遗漏了什么,但除了将日期添加到输出之外,第二个查询似乎与第一个查询完全一样,效率稍低。也许您不知道这一点,但这两个查询都将被视为内部联接,并具有相同的执行计划。第一个中的where谓词有效地将查询从左连接更改为内部连接。@jpw是的,我只是展示了不同的语法。这都是我的偏好。应该有完全相同的结果。
SELECT e.*  --* to return all details, if needed
FROM Employee e
INNER JOIN Employee m ON e.MgrId = m.Empid AND e.DateofJoining < m.DateOfJoining;
SELECT E1.ENAME FROM EMP E1,EMP E2 
WHERE E1.MGR=E2.EMPNO 
AND E1.MGR < E2.MGR;