2012-02-23 3 views
1

У меня есть следующая схема:SQL Assertion: Менеджер комплекса

Emp (Ид INT, ENAME VARCHAR (50), заработная плата с плавающей точкой, электронная почта VARCHAR (80))

Works (Ид INT, сделал ИНТ pct_time поплавка)

DEPT (сделал INT, бюджет поплавка, ManagerID INT)

eid для идентификатора сотрудника. сделал - для отдела id. Я выделил первичные ключи. managerid - это внешний ключ, а также eid и сделал в 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); 

Это даже близко не так ли? Кроме того, возможно, я должен был просто сделать пару CHECKs вместо вставки? Я чувствую, что несколько CHECKs sloppier, но, вероятно, будет легче получить право.

EDIT: Основная причина, я спрашиваю, потому что я не знаю, если я правильно понять НЕ СУЩЕСТВУЕТ

+0

У вас есть 2 столбца с плавающей запятой в 'Emp'.Вы имели в виду, чтобы указать другой столбец вместо второго, или вы просто пропустили тот факт, что вы уже включили этот столбец? –

+0

К сожалению, это была просто опечатка, исправив ее сейчас –

+0

Это может помочь узнать, какой колорит SQl вы используете. Конечно, в SQl-сервере нет таких вещей, как утверждения. – HLGEM

ответ

1

Для NOT EXISTS (SELECT ...), чтобы быть правдой, то SELECT ... не должен возвращать никаких результатов.

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

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


Как OP сказал домашнее задание было превращено в ...

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, который я никогда не использовал, но ... Я никогда не использовал его.

+0

Эй, Сэм, «Посмотрите, можете ли вы написать этот запрос, а затем поместить его внутри НЕ СУЩЕСТВУЕТ» Разве это не то, что я сделал? Я нашел всех зарплату менеджера (M.salary) и сравнил их со всеми зарплатами сотрудников, которые находятся в одном отделе ... Ах, я сравниваю зарплату менеджера с самим собой, поэтому он должен быть равен, и поэтому это утверждение также будет недействительным. Мля! –

+0

Я обновлю свой ответ тем, что буду использовать, а затем даю объяснение, поскольку вы сказали, что вам уже пришлось включить домашнюю работу. –

+0

@Sam прав, что ваш синтаксис недействителен. Для использования '(SELECT ...) <= (SELECT ...)' оба подзаголовка должны возвращать только одну строку. Ваш может вернуть более одного. –

2

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

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 
           ) 
      ) 
) 
+0

Вы оба удивительные, спасибо вам большое! –