如何匹配/比较SQL Server 2008中两个结果集中的值?

时间:2009-09-14 14:17:19

标签: sql sql-server tsql sql-server-2008

我正在处理员工预订申请。我有两个不同的实体项目和用户都被分配了可变数量的技能。

我有一个具有各种技能的技能表(列: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。

我真的很感激有关这方面的任何想法或建议。谢谢!

2 个答案:

答案 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)

你想测试这个调试,因为我没有测试数据来运行它。同上索引以优化它。

(现在发帖,看看有人提出了更好的方法 - 应该有更微妙和有效的东西。)