我正在处理员工预订申请。我有两个不同的实体项目和用户都被分配了可变数量的技能。
我有一个具有各种技能的技能表(列:id,名称) 我在名为UserSkills的表中注册用户技能(有两个外键列:fk_user和fk_skill) 我在另一个名为ProjectSkills的表中注册项目技能(有两个外键列:fk_project和fk_skill)。
在注册设置技能时,项目可能需要6种不同的技能和用户。
棘手的部分是我必须根据他们的技能为我的项目找到用户。我只对符合项目要求的所有技能的用户感兴趣。用户被允许拥有更多技能,然后需要。
以下代码不起作用(即使它确实如此,也不会非常友好),但它说明了我的想法:
SELECT * FROM Users u WHERE
( SELECT us.fk_skill FROM UserSkills us WHERE us.fk_user = u.id )
>=
( SELECT ps.fk_skill FROM ProjectSkills ps WHERE ps.fk_project = [some_id] )
我正在考虑制作我自己的函数,它接受两个TABLE变量,然后计算出comparisson(一种经过修改的IN函数),但我宁愿找到一个性能更友好的解决方案。
我正在开发SQL Server 2008。
我真的很感激有关这方面的任何想法或建议。谢谢!
答案 0 :(得分:6)
SELECT *
FROM Users u
WHERE NOT EXISTS
(
SELECT NULL
FROM ProjectSkill ps
WHERE ps.pk_project = @someid
AND NOT EXISTS
(
SELECT NULL
FROM UserSkills us
WHERE us.fk_user = u.id
AND us.fk_skill = ps.fk_skill
)
)
答案 1 :(得分:0)
-- Assumes existance of variable @ProjectId, specifying
-- which project to analyze
SELECT us.UserId
from UserSkills us
inner join ProjectSkills ps
on ps.SkillId = us.SkillId
and ps.ProjectId = @ProjectId
group by us.UserId
having count(*) = (select count(*)
from ProjectSkills
where ProjectId = @ProjectId)
你想测试这个调试,因为我没有测试数据来运行它。同上索引以优化它。
(现在发帖,看看有人提出了更好的方法 - 应该有更微妙和有效的东西。)