【问题标题】:How to determine if an employee is a manager?如何判断员工是否是经理?
【发布时间】:2013-06-02 02:17:02
【问题描述】:

使用 EMP 表,其中 MANAGER 代表员工的经理:

EMPLOYEE   MANAGER
1          NULL
2          1
3          1
4          2
5          2

如何进行查询以确定员工是否为经理?

EMPLOYEE   STATUS
1          IS MANAGER
2          IS MANAGER
3          IS NOT MANAGER
4          IS NOT MANAGER
5          IS NOT MANAGER

是否可以在没有子查询的情况下做到这一点?

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    您可以JOIN 表本身并使用CASE 语句:

    SELECT DISTINCT E.Employee, 
        CASE 
           WHEN M.Employee IS NOT NULL THEN 'IS MANAGER' 
           ELSE 'IS NOT MANAGER' END Status
    FROM YourTable E
       LEFT JOIN YourTable M ON E.Employee = M.Manager
    

    使用OUTER JOIN 获取所有员工,而不仅仅是经理。

    【讨论】:

    • +1。正是我在写你的答案时写的,这就是我将如何准确解决这种情况。
    • 我注意到您使用了DISTINCT 以使其正常工作。另外,我反向加入他们(E.Manager = M.Employee)。为什么它会这样工作?谢谢。
    • @ChristopherMarkieta -- 因为JOIN 而需要DISTINCT -- 没有它,可能会返回重复记录。加入 E.Manager=M.Employee 上的表只会返回经理存在的记录。很高兴我能帮上忙!
    【解决方案2】:

    简短的回答是否定的。鉴于您显示的结构,如果没有连接/子查询/CTE,则无法显示该人是否是链的顶部:

    SELECT *
    FROM EMP 
    WHERE MANAGER IS NULL
    

    但除此之外,您还需要一个联接/子查询/CTE。

    【讨论】:

    • 我有同样的问题。但我有 2 张桌子 - 员工和员工经理。 Employee 表有 3 列——employeeId (pk)、firstname、lastname。 EmployeeManager 表有 5 列——employeemanagerid (PK)、employeeid(FK 引用员工 >employeeid)、managerid(FK 引用员工 >employee id、effectivestartdate 和 Effectiveenddate 我需要将记录显示为 Employeeid、firstname、lastname、isManager IsManager 列可以有 2值 Y 表示是,N 表示否。我需要找到今天的状态。即在当天运行查询。有帮助吗?
    【解决方案3】:

    要获取经理主键列表,只需

    SELECT DISTINCT
        MANAGER
    FROM 
        EMP;
    

    要获取有关每个经理的更多信息,假设该表还包含经理姓名等信息:

    SELECT DISTINCT
        m.employee, m.given_name, m.surname
    FROM
        EMP m
    JOIN
        EMP e
    ON
        e.manager = m.employee;
    

    我最初忽略了经理的 ID,但我对其进行了编辑以添加它,以防组织有两个同名的经理:比如 John Smith。

    如果您想要状态消息,可以使用 CASE 调用。

    SELECT
        MANAGER,
        CASE COUNT(*)
            WHEN 0 THEN "IS NOT MANAGER"
            ELSE "IS MANAGER"
        END "STATUS"
    FROM
        EMP
    GROUP BY
        MANAGER;
    

    【讨论】:

    • 我的最后一个建议是愚蠢的,因为它不会显示任何未出现在经理列中的员工 ID。外部连接将是必要的。
    猜你喜欢
    • 2016-12-30
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2012-05-15
    相关资源
    最近更新 更多