不允许SQL Server约束子查询

时间:2017-04-24 20:37:25

标签: sql sql-server

我有以下3个表格:

  1. 员工
  2. 部门
  3. employees_departments(员工和部门之间的联系表以及其他信息)
  4. 该部门还有一个列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一般也很少。

    任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

即使您可以这样做,当数据发生变化时,您会发生什么样的情况?对于某些行,约束失败(就像经理获得减薪)?听起来这可能是一个糟糕的问题/业务规则描述。

如果它纯粹是插入/更新时间检查,则使用代码或(yuk)触发器。

另一种选择可能是使用可更新的视图,该视图仅选择低于其经理(即每个人)的员工。通过更新和插入,您可以在每种情况下使其工作,因为如果视图中的插入/更新不满足视图的标准,它将拒绝它。

阅读视图,特别是WITH CHECK OPTION

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql