我有以下架构:
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很邋,,但可能更容易做对。
编辑:我问的主要原因是因为我不知道我是否正确地理解了不存在答案 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,但是......我从未使用过它。