SQL Утверждение: Менеджер комплекса - PullRequest
1 голос
/ 23 февраля 2012

У меня есть следующая схема:

Emp ( eid int, ename varchar (50), плавающая зарплата, электронная почта varchar (80))

Работает ( eid int, did int, pct_time float)

Отдел ( сделал int, бюджетное плавающее число, managerid int)

eid для идентификатора сотрудника. сделал для идентификатора отдела. Я выделил первичные ключи. managerid - это внешний ключ, а также eid и do в Works.

Теперь я хотел бы добавить утверждение «комплексный менеджер», которое гарантирует, что у менеджера всегда будет более высокая зарплата, чем у любого сотрудника, которым он / она управляет.

Вот о чем я думал:

CREATE ASSERTION managerComplex
CHECK
( NOT EXISTS (SELECT  M.salary  
              FROM Dept D, Emp M 
              WHERE D.managerid = M.eid) <= 
                                           (SELECT E.salary
                                            FROM Works W, Emp E
                                            WHERE W.eid = E.eid) AND
                                                                     D.did = W.did);

Это даже близко к праву? Кроме того, может быть, я должен был просто сделать пару чеков вместо вставки? Я чувствую, что множественные ПРОВЕРКИ являются неаккуратными, но, вероятно, их будет проще получить.

РЕДАКТИРОВАТЬ: Основная причина, которую я спрашиваю, заключается в том, что я не знаю, правильно ли я понимаю, НЕ СУЩЕСТВУЕТ

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

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

CREATE ASSERTION managerComplex
CHECK
( NOT EXISTS ( SELECT  *
               FROM Dept D, Emp M 
               WHERE D.managerid = M.eid
                 AND M.salary < ANY
                               ( SELECT E.salary
                                 FROM Works W, Emp E
                                 WHERE W.eid = E.eid 
                                   AND D.did = W.did
                                   AND M.eid <> E.eid
                               )
             )
)
1 голос
/ 23 февраля 2012

Чтобы значение NOT EXISTS ( SELECT ...) было истинным, SELECT ... не должно возвращать результатов.

Вы хотите создать заявление SELECT, которое будет возвращать любому сотруднику с зарплатой выше, чем менеджер, указанный для отдела (ов), в котором он работает. Посмотрите, можете ли вы написать этот запрос, а затем поместить его в NOT EXISTS

Я не совсем уверен, что вы написали даже допустимый SQL, но это, конечно, не то, что вы хотите. У меня есть потенциальный ответ для вас, но так как это было отмечено домашней работой, я хотел бы попытаться подтолкнуть вас в правильном направлении, прежде чем дать полный ответ.


Как сказал ОП, домашнее задание сдано ...

CREATE ASSERTION managerComplex
CHECK
(NOT EXISTS (SELECT E.salary
             FROM Emp M, Dept D, Works W, Emp E
             WHERE M.eid = D.managerid AND 
                   W.did = D.did AND
                   E.eid = W.eid AND
                   E.salary > M.salary))

Мой NOT EXISTS имеет запрос внутри него, который будет возвращать результаты, если зарплаты сотрудников выше, чем зарплаты их соответствующих менеджеров. Я смотрю на всех сотрудников, которые работают в отделе, и включаю их в набор результатов только в том случае, если их зарплата выше, чем у менеджера по зарплате этого отдела.

Я даже не уверен, что ваш SQL действителен, так как у вас есть (SELECT ...) <= (SELECT ...) AND .... Сравнение наборов результатов с <= не имеет никакого смысла для меня. Возможно, это просто SQL, который я никогда не использовал, но ... я никогда не использовал его.

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