В плане дизайна я не понимаю, зачем вам нужно Person_Vacation
.Если я правильно понимаю ваш дизайн, каждый отпуск - это событие (то есть «наследование»), поэтому связь между Vacation
и Person
может быть установлена через Person_Event
.Тогда запросы будут:
Количество человек в отпуске:
SELECT P.PersonID, V.locaton
FROM Person P, Vacation V, Person_Event PE
WHERE P.personid = PE.personID AND PE.eventid = V.eventid
Число лиц, не участвующих в отпуске:
SELECT P.PersonID, E.title
FROM Person P, Person_Event PE, Event E
WHERE P.personid = PE.personID AND PE.eventid = E.eventid
AND E.eventID NOT IN (SELECT eventid FROM Vacation)
Число лиц, не входящих в любой каникулы:
SELECT P.PersonID, E.title
FROM Person P, Person_Event PE, Event E
WHERE P.personid = PE.personID AND PE.eventid = E.eventid
AND P.personID NOT IN
(SELECT personid FROM Person_Event PE, Vacation V WHERE PE.eventid = V.eventid)
Если вы хотите использовать свой собственный дизайн, вам нужно решить, будете ли вы включать отпуск человека только в Person_Vacation
или в Person_Vacation
и Person_Event
.Если вы сделаете первое, то приведенные выше запросы станут немного проще.
Однако я все равно проголосовал бы за мой дизайн, потому что то, что вы по сути делаете, - это преждевременное разделение данных, чтобы получить немного производительности / простоты.Это может не окупиться в долгосрочной перспективе.