代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  6
  • Alex  · 技术社区  · 17 年前

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

    我有一个包含各种技能的技能表(列:id,name) 我在一个名为UserSkills的表中注册用户技能(有两个外键列:fk_user和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] )
    

    我正在考虑制作一个包含两个表变量的函数,然后在其中进行比较(有点像修改过的in函数),但我更愿意找到一个性能更友好的解决方案。

    我正在开发SQL Server 2008。

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

    2 回复  |  直到 17 年前
        1
  •  6
  •   Quassnoi    17 年前
    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
                    )
            )
    
        2
  •  0
  •   Philip Kelley    17 年前
    --  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)
    

    (现在发布,看看是否有人想出了更好的方法——应该有比这更微妙、更有效的方法。)