我有以下3个表格:
该部门还有一个列manager_id
,它是employees
表的一个外键(一个部门有一个来自employees表的经理)。
我有一个要求,即我必须设置一个约束,其中经理下的任何员工都不能拥有比经理更高的薪水。
我尝试解决这个问题:
ALTER TABLE employees
ADD CONSTRAINT check_salary
CHECK (salary > (SELECT salary
FROM employees e2
INNER JOIN employees_departments ed2 ON e2.id_employee = ed2.id_employee
INNER JOIN departments d2 ON d2.id_department = ed2.id_department
WHERE e2.id_employee != manager_id (but how do I get the manager id)
AND d2.id_departament = manager_department_id (again don't know how to do get it)
)
我收到一个错误,即不允许子查询。这甚至可以在约束中进行吗?如何在普通查询中建模?
我还必须补充一点,我对SQL Server几乎没有经验,而且对SQL一般也很少。
任何帮助都非常感谢!
答案 0 :(得分:0)
即使您可以这样做,当数据发生变化时,您会发生什么样的情况?对于某些行,约束失败(就像经理获得减薪)?听起来这可能是一个糟糕的问题/业务规则描述。
如果它纯粹是插入/更新时间检查,则使用代码或(yuk)触发器。
另一种选择可能是使用可更新的视图,该视图仅选择低于其经理(即每个人)的员工。通过更新和插入,您可以在每种情况下使其工作,因为如果视图中的插入/更新不满足视图的标准,它将拒绝它。
阅读视图,特别是WITH CHECK OPTION
。
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql