Sql server 2008 T-SQL-动态计算布尔字段
我正在使用SQLServer2008 假设我有两个假设表,如下所示: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
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