How to match/compare values in two resultsets in SQL Server 2008?

11,479
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
                )
        )
Share:
11,479
Admin
Author by

Admin

Updated on July 08, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm working on a employee booking application. I've got two different entities Projects and Users that are both assigned a variable number of Skills.

    I've got a Skills table with the various skills (columns: id, name) I register the user skills in a table called UserSkills (with two foreign key columns: fk_user and fk_skill) I register the project skills in another table called ProjectSkills (with two foreign key columns: fk_project and fk_skill).

    A project can require maybe 6 different skills and users when registering sets up their Skills aswell.

    The tricky part is when I have to find users for my Projects based on their skills. I'm only interested in users that meet that have ALL the skills required by the project. Users are ofcause allowed to have more skilled then required.

    The following code will not work, (and even if it did, would not be very performance friendly), but it illustrates my idea:

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

    I'm thinking about making my own function that takes two TABLE-variables, and then working out the comparisson in that (kind of a modified IN-function), but I'd rather find a solution that's more performance friendly.

    I'm developing on SQL Server 2008.

    I really appreciate any ideas or suggestions on this. Thanks!

  • Admin
    Admin almost 15 years
    OMG! You replied with the correct answer after just 2½ minutes! You are my hero! ;) This was my first question on stackoverflow, but surely not my last... Thank you, your help is much appreciated!
  • Philip Kelley
    Philip Kelley almost 15 years
    Zounds. Is there a website somewhere that spells out and clarifies the hows and whys behind this use of correlated subqueries?
  • Quassnoi
    Quassnoi almost 15 years
    @Philip Kelley: I'm currently writing a series of articles on NOT IN vs NOT EXISTS vs LEFT JOIN / IS NULL in different RDBMS's.
  • Admin
    Admin almost 15 years
    This answer worked great, but spawned another question: stackoverflow.com/questions/1423440/… Any suggestions are welcome! ;)