在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实际上是一个自联接到员工的成员。