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

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

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

我有一个包含各种技能的技能表(列: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] )

我正在考虑制作自己的函数,它需要两个表变量,然后进行比较(一种修改后的 IN 函数),但我宁愿找到一个对性能更友好的解决方案。

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

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

最佳答案

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

关于sql - 如何在 SQL Server 2008 中匹配/比较两个结果集中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421842/

相关文章:

sql-server - 意外 token 'UpdateOptions.ExpandFull'

sql - 一对多关系不存在的地方

SQL 服务器-GETUTCDATE() 'Incorrect syntax near )'

mysql - 连接 SQL 查询无法填充下拉列表

sql-server - SQL Server 中的查询性能

mysql - 多个 MYSQL 语句合二为一

sql-server - 选择跨列的前 n 个值并求平均值

sql - LEFT OUTER JOIN 如何返回比左表中存在的记录更多的记录?

Mysql - 如何在每行的第二个字符后插入一个点?

sql - 如何制作可重复的索引脚本?