【问题标题】:How to match/compare values in two resultsets in SQL Server 2008?如何匹配/比较 SQL Server 2008 中两个结果集中的值?
【发布时间】:2009-09-14 14:17:18
【问题描述】:

我正在开发一个员工预订应用程序。我有两个不同的实体项目和用户,它们都分配了可变数量的技能。

我有一个包含各种技能的技能表(列:id、name) 我在一个名为 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 变量的函数,然后计算其中的比较(一种修改后的 IN 函数),但我宁愿找到一个性能更友好的解决方案。

我正在 SQL Server 2008 上进行开发。

我非常感谢任何关于此的想法或建议。谢谢!

【问题讨论】:

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


    【解决方案1】:
    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.5 分钟后回答了正确答案!你是我的英雄! ;) 这是我关于 stackoverflow 的第一个问题,但肯定不是我的最后一个问题……谢谢,非常感谢您的帮助!
    • Zounds。是否有网站可以阐明并阐明这种使用相关子查询背后的方式和原因?
    • @Philip Kelley:我目前正在写一系列关于NOT IN vs NOT EXISTS vs LEFT JOIN / IS NULL 在不同RDBMS 的文章。
    • 这个答案效果很好,但产生了另一个问题:stackoverflow.com/questions/1423440/… 欢迎任何建议! ;)
    【解决方案2】:
    --  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)
    

    您想对此进行调试,因为我没有测试数据可以运行它。同上索引以优化它。

    (现在发帖,看看有没有人想出更好的方法——应该有比这更微妙和更有效的方法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多