【问题标题】:List of employees who are not managers非经理员工名单
【发布时间】:2014-09-03 16:51:11
【问题描述】:

我想提取不是经理的员工名单...

如果您有更好的查询,请查看以下两个查询帖子...

查询 1:

SELECT Empno, Ename, Job, Sal
FROM Emp
WHERE Empno NOT IN (SELECT NVL(MGR,0) FROM Emp)

查询 2:

SELECT Empno, Ename, Job, Sal
FROM Emp
WHERE Empno NOT IN (SELECT DISTINCT MGR FROM Emp WHERE MGR IS NOT NULL)

【问题讨论】:

  • 它们应该都可以正常工作。我更喜欢coalesce() 而不是nvl(),因为coalesce() 是ANSI 标准并且可以跨数据库工作。

标签: sql oracle


【解决方案1】:

这可能运行得更快,具体取决于索引的字段:

select x.empno, x.ename, x.job, x.sal
  from emp x
  left join emp y
    on x.empno = y.mgr
 where y.mgr is null

对同一个表使用外连接,并过滤 empno 从未作为值出现在表的 mgr 列中的行。

【讨论】:

    【解决方案2】:
    select * from emp a
    where not exists 
    (select 1 from emp where manager_id =a.emp_id);
    

    上面的 sql 会找到所有不是经理的员工,并且存在性能比没有更好的函数

    【讨论】:

      【解决方案3】:

      使用 oracle 特定功能:

      select Empno, Ename, Job, Sal from Emp
      where CONNECT_BY_ISLEAF = 1
      start with MGR is null
      connect by prior Empno = MGR;
      

      有关如何使用它的示例,请参阅http://sqlfiddle.com/#!4/858e0/3

      但如果没有经理层级就更容易了:

      SELECT Empno, Ename, Job, Sal FROM Emp WHERE MGR IS NOT NULL
      

      【讨论】:

        【解决方案4】:

        在下面检查:

        SELECT E.LAST_NAME,E.EMPLOYEE_ID FROM EMPLOYEES EWHERE EMPLOYEE_ID not in 
           (SELECT MANAGER_ID FROM EMPLOYEES where MANAGER_ID is not null)
        

        【讨论】:

          【解决方案5】:
          SELECT * FROM employees
          WHERE id <> managerid
          

          【讨论】:

          • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
          【解决方案6】:

          这是涵盖所有情况的最佳解决方案

          select e.name
            from employees as e
            left join employees as m
              on e.id = m.managerId
           where m.managerId is null
          

          【讨论】:

            【解决方案7】:
            create table empinfo(last_name varchar2(20),job_title varchar2(20));
            insert into empinfo (last_name,job_title)values('Peterson','Manager');
            insert into empinfo (last_name,job_title)values('Pollard','Project Engineer');
            insert into empinfo (last_name,job_title)values('Taylor','Developer');
            insert into empinfo (last_name,job_title)values('Mlinga','Tester');
            select last_name,job_title from empinfo where job_title NOT LIKE 'Manager';
            

            【讨论】:

              【解决方案8】:

              试试这个查询,它会起作用的

              SELECT Empno, Ename, Job, Sal
              FROM Emp
              WHERE Job != 'MANAGER'
              

              SELECT Empno, Ename, Job, Sal
              FROM Emp
              WHERE Job NOT LIKE 'MANAGER'
              

              【讨论】:

                【解决方案9】:

                select * from employee where emp_id not in (select manager_id from employee where manager_id IS NOT NULL);

                select t1.* from from sales.staff t1 where not exists ( select 1 from sales.staff t2 where t1.staff_id=t2.manager_id )

                发现更多: Finding employees who are not managers

                【讨论】:

                  猜你喜欢
                  • 2022-12-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-09-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-01-07
                  • 2020-03-12
                  相关资源
                  最近更新 更多