3

私は3つのテーブルを持っています:

  • tblEmployee

    employeeId int PK

    名前varchar(50)

  • tblSkill

    スキルIDintPK

    名前

  • tblEmployeeSkill

    employeeSkill int PK

    employeeId int FK

    スキルID整数FK

すべてのスキルと、特定のユーザーがそれらを持っているかどうかを返すクエリを実行したいと思います。すなわち:

SQL | いいえ

C#| はい

ルビー| いいえ

ここで、userId = 1

助けてください?

4

2 に答える 2

3

これには、スキルのリストに対する単純な LEFT JOIN で十分です。従業員がそのスキルに一致するエントリを持っていない場合、そのエントリの主キーは NULL になります。

SELECT tblSkill.name, 
       CASE 
         WHEN tblEmployeeSkill.employeeSkill IS NULL THEN 'no' 
         ELSE 'yes' 
       END as hasSkill
FROM tblSkill
LEFT JOIN tblEmployeeSkill 
  ON tblSkill.skillId = tblEmployeeSkill.skillId 
  AND tblEmployeeSkill.employeeId = 1
于 2013-01-14T16:29:14.523 に答える
1

私の理解では、すべてのスキルをすべてのユーザーに配布したいと考えています。これが、以下のクエリにデカルト積を生成するサブクエリがある理由です。積の結果はテーブルtblEmployeeと再び結合tblSkillされ、それぞれの名前を取得できるようになります。

そして最後の部分はLEFT JOIN、ユーザーに対する特定のスキルが table に存在するかどうかを確認するためのものtblEmployeeSkillです。結果が の場合NULL、ユーザーがまだそのスキルを持っていないことを意味します。

SELECT  y.name EmployeeName,
        z.name SkillName,
        CASE WHEN xx.skillID IS NULL
            THEN 'NO'
            ELSE 'YES'
        END status
FROM
    (
        SELECT  a.employeeID, b.skillID
        FROM    tblEmployee a 
                CROSS JOIN tblSkill b
    ) x
    INNER JOIN  tblEmployee y
        ON x.employeeID = y.employeeID
    INNER JOIN tblSkill z
        ON x.skillID = z.skillID
    LEFT JOIN tblEmployeeSkill xx
        ON  x.employeeID = xx.employeeID AND
            x.skillID = xx.skillID
-- WHERE   x.employeeId = 1   -- uncomment this if you
                              -- want to select only one user
于 2013-01-14T16:27:26.727 に答える