Как сопоставить / сравнить значения в двух наборах результатов в SQL Server 2008? - PullRequest
6 голосов
/ 14 сентября 2009

Я работаю над заявкой на бронирование сотрудников. У меня есть две разные сущности: Проекты и Пользователи, которым назначено переменное число Навыков.

У меня есть таблица навыков с различными навыками (столбцы: 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.

Я действительно ценю любые идеи или предложения по этому вопросу. Спасибо!

Ответы [ 2 ]

6 голосов
/ 14 сентября 2009
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
                )
        )
0 голосов
/ 14 сентября 2009
--  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)

Вы бы хотели проверить эту отладку, поскольку у меня нет тестовых данных для ее запуска. То же самое касается индексации для ее оптимизации.

(Теперь, чтобы опубликовать и посмотреть, придумал ли кто-то лучший способ - должно быть что-то более тонкое и эффективное, чем это.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...