2017-04-24 8 views
0

を許可されていないサブクエリ私は、次の3つのテーブルを持っていますemployeesテーブルの外部キーである列manager_idもあります(部門にはemployeesテーブルのマネージャがあります)。SQL Serverの制約が

私は、マネージャの下の従業員がマネージャより高い給与を持つことができないという制約を設ける必要があるという要件があります。これを解決するに

私の試み:

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はほとんどないと付け加えなければなりません。

大変助かりました!

+3

チェック制約で直接サブクエリを使用することはできません。あなたはスカラーUDFを使うことができますが、チェック制約の中にはこれらの問題がたくさんあります。 –

+0

本当に欲しいのは、外部キーの制約です。つまり、クエリに「クエリ」を取得するには、クエリを含む関数を記述してスカラー値を出力し、その関数をチェック制約で使用することができます。 –

答えて

0

これを行うことができたとしても、一部の行で制約が満たされないようにデータが変更された場合(マネージャーが給与を削減した場合など)はどうなりますか?このような音は、問題/ビジネスルールの記述が悪い可能性があります。

純粋に挿入/更新時間のチェックであれば、コードを使用するかトリガーを使用します。

もう1つの方法として、管理者(つまり誰もが)以下の従業員を選択する更新可能なビューを使用することができます。更新と挿入によって、ビューへの挿入/更新がビューの基準を満たさない場合、それを拒否するため、すべての場合に機能するようにすることができます。

ビュー上、特にWITH CHECK OPTIONを参照してください。

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

関連する問題