我正在使用SQL Server 2008。
假设我有两个假设的表格如下:
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
)
现在,我想返回[Person]
表中的行列表(即给定部门的人员列表)。这些行中只有一个(或零)与[ManagerId]
表中的[Department]
字段匹配。我想在运行中用匹配的行标记一个布尔字段......结果行集将类似于以下模式:
[Id] INT,
[IsManager] BIT NOT NULL DEFAULT 0,
-- other fields
当[IsManager]
与[Department].[ManagerId]
匹配时,[Person].[Id]
字段将为TRUE。
这对于两个(或更多)查询来说相当简单。但是如何使用单个SQL语句?
实现此目的答案 0 :(得分:3)
在您的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>
答案 1 :(得分:2)
从Person表到ManagerId上的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
工作原理:无论在ManagerId上是否存在相应的Department匹配,Person中的所有行都将返回。对于那些没有匹配部门的Person记录,结果集中的所有Department字段都是NULL,因此我们可以使用它来确定是否存在匹配。
请注意,如果某人是多个部门的经理,则此查询可能会返回重复的人员记录。为此,我将DepartmentId添加到列表中。如果您需要一个唯一的人员列表及其IsManager标志,请从select子句中删除d.DepartmentId并在选择后插入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