3

我正在使用 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]字段将为 TRUE 。[Department].[ManagerId][Person].[Id]

这对于两个(或更多)查询来说是相当微不足道的。但是我怎样才能使用单个 SQL 语句来实现呢?

4

2 回答 2

4

在您的子句中添加一个表达式,SELECT将实际人员IdManagerId人员部门的人员进行比较

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>
于 2012-06-26T06:58:45.940 回答
2

从 Person 表到 ManagerId 上的部门表的左连接将为您解决问题:

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 上是否存在相应的 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
于 2012-06-26T07:12:45.847 回答