在SQL中查找IsManager的最简单方法

时间:2011-10-12 12:44:37

标签: sql sql-server-2005

简单的员工结构表

Employee      Manager
Joe Smith      Jon Smith
Jon Smith      Pete Stevens
Pete Stevens   NULL
Jared Scho     Pete Stevens
....

我只是想回复一些结果,但我想要一个关于这个人是否是经理的指标,结果应该是:

Employee       Manager      IsAManager
Joe Smith     Jon Smith         0
Jon Smith     Pete Stevens      1
Pete Stevens    NULL            1
Jared Scho    Pete Stevens      0

结果集显示Joe Smith和Jared Scho不是经理......

所以如果我有一个简单的SQL查询

SELECT
   Employee,
   Manager,
   As IsAManager   --tried to do a case statement here....
FROM
   Employee

我试图做一个案例声明,这个效果:

SELECT CASE ISNULL(COUNT(*), 0) > 0 THEN 1 ELSE 0 END FROM Employee WHERE Manager = Employee

不确定如何说出来:))

2 个答案:

答案 0 :(得分:1)

要确定员工是否是经理,您需要将员工ID(在本例中为名称)与经理ID(在本例中为经理列)列表进行匹配。如果您找到匹配项,则该员工是经理。如果找不到匹配项,则该员工不是经理。

您可以使用LEFT OUTER JOIN执行此操作,如下所示:

  SELECT DISTINCT
   E.Employee,
   E.Manager,
   CASE WHEN M.Employee IS NULL THEN 0 ELSE 1 END As IsAManager  
 FROM
  Employee E LEFT OUTER JOIN Employee M
    ON E.Employee = M.Manager

请注意以下事项:

  • 您没有指定您正在使用的SQL产品,因此我尝试将解决方案设为一般。我猜你试图使用ISNULL它是SQL Server,但这个解决方案应该适用于任何支持CASE的产品。
  • 您存储经理状态的方法有一个问题,即您不能代表没有员工的经理(您从员工 - 经理关系的存在中获得经理状态)。如果您希望能够将经理状态与员工 - 经理关系分开存储,则CREATE TABLE Managers (Employee. . . PRIMARY KEY)。这将使得恢复经理状态所需的代码也更容易编写。

答案 1 :(得分:1)

希望这只是一个演示示例,而不是真正的表结构。

SELECT Employee,
       Manager,
       CASE
         WHEN EXISTS(SELECT *
                     FROM   Employee e2
                     WHERE  e2.Manager = e1.Employee) THEN 1
         ELSE 0
       END As IsAManager
FROM   Employee e1  

有关SQL Server如何处理CASE表达式EXISTS子查询的详细信息,请参阅this article