Sql server 2008 T-SQL-动态计算布尔字段

Sql server 2008 T-SQL-动态计算布尔字段,sql-server-2008,tsql,Sql Server 2008,Tsql,我正在使用SQLServer2008 假设我有两个假设表,如下所示: CREATE TABLE [Department]( [Id] int IDENTITY(1,1), [ManagerId] int NULL, -- << Foreign key to the Person table -- other fields ) CREATE TABLE [Person]( [Id] int

我正在使用SQLServer2008

假设我有两个假设表,如下所示:

CREATE TABLE [Department](
    [Id]            int    IDENTITY(1,1),
    [ManagerId]     int    NULL, -- << Foreign key to the Person table
    -- other fields
)

CREATE TABLE [Person](
    [Id]            int    IDENTITY(1,1),
    [DepartmentId]  int    NOT NULL, -- << Foreign key to the Department table
    -- other fields
)
[部门].[ManagerId]
匹配
[人员].[Id]
时,
[IsManager]
字段将为真


这对于两个(或更多)查询来说是相当简单的。但是,如何使用一个单一SQL语句来实现这一点呢?

在您的
SELECT
子句中添加一个表达式,在该子句中,您可以将实际人员
Id
与人事部门的
ManagerId
进行比较

SELECT
    Person.Id,
    Department.Id,
    CAST(CASE WHEN Person.Id=Department.ManagerId THEN 1 ELSE 0 END AS BIT) AS IsManager
FROM Person
INNER JOIN Department ON Person.DepartmentId=Department.Id
WHERE Person.DepartmentId=<CONDITION>
选择
个人身份证,
部门Id,
强制转换(当Person.Id=Department.ManagerId时为1,否则0以位结束)为IsManager
从个人
在Person.DepartmentId=Department.Id上加入内部部门
WHERE Person.DepartmentId=

在ManagerId上,从Person表到department表的左连接将为您实现以下功能:

SELECT p.Id AS PersonId, d.Id AS DepartmentId, 
    CAST(CASE WHEN d.Id IS NULL THEN 0 ELSE 1 END) AS IsManager
FROM Person p LEFT JOIN Department d ON p.Id = d.ManagerId
工作原理:Person的所有行都返回,而不管ManagerId上是否存在匹配的对应部门。对于那些没有匹配部门的人员记录,resultset中的所有部门字段都为空,因此我们可以使用该字段来确定是否存在匹配项

请注意,如果一个人是多个部门的经理,此查询可能会返回重复的个人记录。为此,我已将DepartmentId添加到列表中。如果需要唯一的人员列表及其IsManager标志,请从select子句中删除d.DepartmentId,并在select后插入DISTINCT:

SELECT DISTINCT p.Id AS PersonId, 
    CAST(CASE WHEN d.DepartmentId IS NULL THEN 0 ELSE 1 END) AS IsManager
FROM Person p LEFT JOIN Department d ON p.Id = d.ManagerId

为什么
ManagerId
上的
LEFT JOIN
?表
Department
总是被引用的,所以做一个
内部连接
。没有重复项,也不需要使用
不同的
。请看我的小错误修复:选择p.Id作为PersonId,d.Id作为DepartmentId,将d.Id为NULL时的大小写转换为0,其他1作为位结束)作为IsManager从p左开始在p.Id=d.ManagerID上加入部门d谢谢,我已经编辑过了。为什么
左连接
?因为这个问题需要所有的人,包括那些经理,而不仅仅是他们自己部门的经理。如果有一个高级管理部门,该部门的每个成员都是不同部门的经理,那么
内部连接将不起作用。然而,哪种解决方案最能解决问题取决于数据的结构。(只是说说而已)。
SELECT DISTINCT p.Id AS PersonId, 
    CAST(CASE WHEN d.DepartmentId IS NULL THEN 0 ELSE 1 END) AS IsManager
FROM Person p LEFT JOIN Department d ON p.Id = d.ManagerId