SQL Query,join返回一个列表

时间:2013-01-14 16:22:33

标签: sql join

我有三张桌子:

  • tblEmployee

    employeeId int PK

    name varchar(50)

  • tblSkill

    skillId int PK

    名称

  • tblEmployeeSkill

    employeeSkill int PK

    employeeId int FK

    skillId int FK

我想运行一个查询,它将返回所有技能以及特定用户是否拥有它们。即:

SQL |无

C#|是

红宝石|无

其中userId = 1

有什么帮助吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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