3

我有三张桌子:

  • tblEmployee

    employeeId int PK

    名称 varchar(50)

  • 技能

    技能ID int PK

    姓名

  • tblEmployeeSkill

    员工技能智力PK

    employeeId int FK

    SkillId int FK

我想运行一个查询,该查询将返回所有技能以及特定用户是否拥有这些技能。IE:

SQL| 不

C# | 是的

红宝石 | 不

其中用户 ID = 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

据我了解,您希望将所有技能分发给所有用户。这就是为什么下面的查询有一个产生笛卡尔积的子查询的原因。产品的结果然后与表连接tblEmployeetblSkill以便能够获得它们各自的名称。

最后一部分是LEFT JOIN检查用户的某种技能是否存在于桌面上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 回答