2012-02-23 16 views
1

I持って次のスキーマ:SQLアサーション:マネージャーの複雑な

のEmp(EID int型、ENAMEのVARCHAR(50)、給与フロート、電子メールはvarchar(80))

ワークス(EID int型、 int型、pct_timeフロート)(でし int型、予算のフロート、マネージャーID int型)

部門をしました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を作成したはずですか? 私は複数のCHECKsが嫌な気がしますが、おそらくもっと簡単になるでしょう。

編集:私はNOT EXISTS (SELECT ...)が真であるためには、SELECT ...は何の結果を返さない必要があります私が正しく理解してる場合ではない

+0

あなたは 'Emp'に2つの' salary float'カラムを持っています。2つ目の列の代わりに別の列を指定することを意味しましたか、または既にその列を含めたという事実を忘れましたか? –

+0

おっと、ちょうどタイプミスで、今修正しています –

+0

あなたが使用しているSQlの味を知るのに役立つかもしれません。確かに、SQlサーバにアサーションなどのことはありません。 – HLGEM

答えて

1

をEXISTS知らないので、私は求めています主な理由です。

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、それぞれの管理者よりも高い任意の従業員の給与がある場合に結果を返します。その中のクエリを、持っています給料。私は部門のために働くすべての従業員を見て、彼らの給与がその部門の給与のマネージャーより高い場合にのみ結果セットにそれらを引き出す。

(SELECT ...) <= (SELECT ...) AND ...のように、あなたのSQLが有効であるかどうかはわかりません。結果セットを<=と比較することは私には意味がありません。それは私が一度も使ったことのないSQLだけかもしれませんが...私はそれを使ったことはありません。

+0

が、これは私がやったものではありませんねえサム、 は「あなたがそのクエリを記述して、EXISTS、NOTの内側に置くことができます参照してください」?私はすべてのマネージャー給料(M.salary)を見つけて、それらを同じ部門にあるすべての従業員給与と比較しました...ああ、私はマネージャー給与とそれ自身を比較しています。したがってそれは等しくなければならず、したがってこの主張無効となります。ブラッ! –

+0

私はあなたの宿題を変えなければならないと言っていたので、私が使っているものを自分の使っているものに更新して説明をします。 –

+0

@Samはあなたの構文が正しくないことが正しいです。 '(SELECT ...)<=(SELECT ...) 'を使用するには、両方の副選択が1つの行だけを返す必要があります。あなたは複数を返すことができます。 –

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 
           ) 
      ) 
) 
+0

あなたは両方とも素晴らしいです、ありがとう! –