我有三张桌子:
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
有什么帮助吗?
答案 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)
据我了解,您希望将所有技能分发给所有用户。这就是为什么下面的查询有一个产生笛卡尔积的子查询的原因。然后,产品的结果与表tblEmployee
和tblSkill
联接,以便能够获得各自的名称。
最后一部分是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