Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中查找IsManager的最简单方法_Sql_Sql Server 2005 - Fatal编程技术网

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

在SQL中查找IsManager的最简单方法,sql,sql-server-2005,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 Sm

员工简易结构表

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
结果显示乔·史密斯和贾里德·肖不是经理

如果我有一个简单的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

不确定如何使用:)

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

可以使用左外部联接执行此操作,如下所示:

  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的产品
  • 存储经理状态的方法有一个问题,即您不能表示没有员工的经理(您从员工-经理关系的存在中派生经理状态)。如果希望能够将经理状态与员工-经理关系分开存储,则
    创建表经理(员工…主键)
    。这将使恢复经理状态所需的代码也更容易编写

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

      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表达式中的子查询的详细信息,请参见。

      您可以执行自联接来解决此问题。此结构将在将来给您带来名称更改、拼写错误、,等等。您真的应该改为使用EmployeeId而不是EmployeeId来处理经理关系的employees表EmployeeName@RajMore-更不用说你不能雇佣两个同名的人了。+1问题是(现在)标记了SQL Server 2005,因此
      存在
      半联接应该比
      外部联接
      和重复删除更有效。如果下层投票者愿意与此解决方案分享问题,我将很高兴能够增加我对SQL的了解。@MartinSmith:我快速浏览了您链接的文章,这非常有趣。不幸的是,我没有花足够的时间研究任何一个SQL实现来深入研究其内部结构。与直觉相反(至少对我来说),相关的EXISTS会更有效,但正如您指出的,这篇文章确实表明SQL Server对这种模式有特殊处理。@Raj,感谢您指出错误。我对答案进行了编辑,以显示M实际上是一个自联接到员工的成员。