3

SQL Server 2008 を使用しています。

以下のような 2 つの架空のテーブルがあるとします。

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]ここで、テーブルから行のリスト (つまり、特定の部門のスタッフのリスト) を返したいと考えています。これらの行の 1 つ (またはゼロ) のみ[ManagerId]が、テーブル内のフィールドと一致し[Department]ます。そして、その場でブールフィールドで一致した行にフラグを立てたい...結果の行セットは次のスキーマのようになります:

[Id]        INT,
[IsManager] BIT NOT NULL DEFAULT 0,
-- other fields

一致する場合、[IsManager]フィールドは TRUE になります。[Department].[ManagerId][Person].[Id]

これは、2 つ (またはそれ以上) のクエリで行うのはかなり簡単です。しかし、単一の 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 の 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 レコードの場合、結果セットのすべての部門フィールドが NULL であるため、それを使用して一致するかどうかを判断できます。

個人が複数の部門のマネージャーである場合、このクエリは重複する個人レコードを返す可能性があることに注意してください。この目的のために、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
于 2012-06-26T07:12:45.847 に答える