2012-02-23 4 views
1

I가 다음 스키마 :SQL 어설 : 관리자 단지

EMP를 (아이드 INT, ENAME의 VARCHAR (50), 급여 플로트, 이메일 VARCHAR (80))

작품 (이드 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를 작성 했어야합니까? 여러 체크가 느껴지 긴하지만 기분이 좋을 것 같습니다.

편집 : 나는 NOT EXISTS (SELECT ...)이 사실로 들어, SELECT ...은 결과가 없다고합니다 내가 제대로 이해 해요 경우는 NOT

+0

'Emp'에는 2 개의'salary float' 열이 있습니다.두 번째 칼럼 대신에 다른 칼럼을 지정 하시겠습니까? 아니면 이미 칼럼을 포함 시켰습니다. –

+0

죄송합니다. 단지 오타였습니다. 지금 바로 수정하십시오. –

+0

사용중인 SQl의 맛을 알 수 있습니다. SQl 서버에는 단언 할 수 없습니다. – HLGEM

답변

1

존재 모르기 때문에 내가 해달라고 부탁 주된 이유입니다.

SELECT 성명을 작성하여 자신이 근무하는 부서에 대해 나열된 관리자보다 높은 급여를받는 직원을 반환하고자합니다. 당신이 그 쿼리를 쓸 수 있는지 확인한 다음 안에 넣으십시오. NOT EXISTS

당신이 쓴 것이 확실한 것은 확실하지 않지만, 당신이 원하는 것은 아닙니다. 나는 잠재적 인 대답을 가지고 있지만, 숙제가 표시되어 있으므로 완전한 답을 제공하기 전에 올바른 방향으로 당신을 자극하려고 노력하고 싶습니다.


영업 이익은 숙제에 켜진 말했듯이 ...

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

Hey Sam, "해당 쿼리를 작성할 수 있는지 확인한 다음 NOT EXISTS 안에 배치하십시오." 이 작업을 수행하지 않았습니까? 나는 모든 관리자 급여 (M.salary)를 찾아 동일한 부서에있는 모든 직원 급여와 비교했다. 아아 나는 매니저 급여를 그 자체와 비교한다. 그러므로 그것은 평등해야하고 따라서이 주장이되어야한다. 또한 유효하지 않습니다. 어쩌구! –

+0

숙제를해야한다고 말한대로 내 대답을 내가 사용하는 것으로 업데이트하고 설명을 제공합니다. –

+0

@Sam이 구문이 유효하지 않다는 것이 옳습니다. '(SELECT ...) <= (SELECT ...)'를 사용하기 위해서는 두 subselect 모두 한 행만 반환해야합니다. 당신은 둘 이상을 돌려 줄 수 있습니다. –

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

두 분 모두 대단합니다, 고마워요! –