SQL断言:经理复杂

时间:2012-02-23 00:40:53

标签: sql assertions

我有以下架构:

Emp( eid int,ename varchar(50),salary float,email varchar(80))

Works( eid int,执行 int,pct_time浮动)

部门( int,预算浮动,经理ID为

eid是员工ID。 是为了部门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);

这是否接近正确? 另外,也许我应该做一些CHECK而不是插入? 我觉得多个CHECK很邋,,但可能更容易做对。

编辑:我问的主要原因是因为我不知道我是否正确地理解了不存在

2 个答案:

答案 0 :(得分: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
                               )
             )
)

答案 1 :(得分: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,但是......我从未使用过它。