У меня Пользователи , Позиции и Лицензии .
Отношения:
- пользователи могут иметь много лицензий
- должности могут потребовать много лицензий
Таким образом, я могу легко получить требования к лицензии для каждой позиции (ий), а также действующие лицензии для пользователя (ей).
Но мне интересно, как лучше всего сочетать два комплекта ? В соответствии с логикой пользователю нужны как минимум те лицензии, которые требуются для определенной должности. Может быть больше, но остальные не имеют отношения.
Я хотел бы получить результаты с пользователями и подходящими позициями.
PersonID PositionID
1 1 -> user 1 is eligible to work on position 1
1 2 -> user 1 is eligible to work on position 2
2 1 -> user 2 is eligible to work on position 1
3 2 -> user 3 is eligible to work on position 2
4 ...
Как видите, мне нужен результат для всех пользователей, а не по одному на вызов, что намного упростит задачу.
Здесь на самом деле 5 таблиц:
create table Person ( PersonID, ...)
create table Position (PositionID, ...)
create table License (LicenseID, ...)
и отношения
create table PersonLicense (PersonID, LicenseID, ...)
create table PositionLicense (PositionID, LicenseID, ...)
Так что в основном мне нужно найти должности, на которые конкретный человек имеет лицензию для работы. Конечно, здесь гораздо более сложная проблема, потому что есть и другие факторы, но главная цель та же:
Как сопоставить несколько записей одной реляционной таблицы с несколькими записями другой. Это также можно описать как inner join
для набора записей, а не для одной записи, как это обычно делается в TSQL.
Я думаю о языковых конструкциях TSQL:
- наборы строк, но я никогда не использовал их раньше и все равно не знаю, как их использовать
intersect
операторов, может быть, хотя они, вероятно, работают только над целыми наборами, а не группами