我有三张桌子:
tblEmployee
employeeId int PK
名称 varchar(50)
技能
技能ID int PK
姓名
tblEmployeeSkill
员工技能智力PK
employeeId int FK
SkillId int FK
我想运行一个查询,该查询将返回所有技能以及特定用户是否拥有这些技能。IE:
SQL| 不
C# | 是的
红宝石 | 不
其中用户 ID = 1
请问有什么帮助吗?
针对技能列表的一个简单的 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
据我了解,您希望将所有技能分发给所有用户。这就是为什么下面的查询有一个产生笛卡尔积的子查询的原因。产品的结果然后与表连接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