2013-02-24 2 views
0

내 테이블 중 하나에 제약 조건을 추가하여 해당 직원이 현재 근무중인 상태에있는 경우에만 내 직원이 스테이션을 유지하도록하고 있습니다. 그러나 오라클은 제약 조건 내부의 하위 쿼리를 좋아하지 않는 것으로 보입니다.하위 쿼리가 "여기 허용되지 않습니다"

ALTER TABLE STATION ADD CONSTRAINT Check_Worker CHECK (Maintainer IN (
    SELECT * 
     FROM 
      STATION s, 
      FOREST f, 
      COVERAGE c, 
      STATE st, 
      WORKER w 
     WHERE 
      s.x BETWEEN f.MBR_XMin AND f.MBR_XMax AND 
      s.y BETWEEN f.MBR_YMin AND f.MBR_YMax AND 
      f.Forest_Id = c.Forest_Id AND 
      st.State = w.employing_state 
     ) 
    ); 

이 나를 으악 : 그래서

'Question 3' 
    SELECT * 
    * 
ERROR at line 2: 
ORA-02251: subquery not allowed here. 

할, 다시 그 SQLPLUS 내가 할 때이 테이블에서 검사를 좋아하지 않는 동안

나는 내가했다 클래스에서 기억 이 문제를 쉽게 해결할 수있는 옵션이 있습니까? 아마도 여러 제약들?

+0

트리거와 함께 다음과 같이 복잡한 무결성 검사를 수행 할 수 있습니다. http://stackoverflow.com/questions/8418456/is-this-possible-in-oracle-sql/8419526#8419526 – gwaigh

+0

http : /stackoverflow.com/questions/4071024/using-subquery-in-a-check-statement-in-oracle – Max

+0

@ Max의 제안에 대한 답변이 적용됩니다. 트리거 (좋아요), 패키지 (더 나은) 또는 데이터 모델 변경 (최상의 옵션)을 사용해야합니다. – Ben

답변

4

이 문제를 해결하는 한 가지 방법은 데이터 모델을 사용하는 것입니다. 교차점 표를 사용하여 노동자와 역에 가입하십시오.

트릭은 WORKER 및 STATION의 실제 기본 키에 STATE를 추가하는 고유 한 복합 키를 만드는 것입니다.

그래서,이 같은 :

alter table WORKER add constraint wrk_state_uk unique (worker_id, employing_state) ; 

alter table STATION add constraint stn_state_uk unique (station_id, state) ; 

그런 다음 우리는 많은 제약 :)와 함께 교차 테이블을 만듭니다. (분명히 여기서 데이터 유형과 열 이름도 추측하고 있습니다.)

create table station_maintainer (
    station_id number not null 
    , station_state number not null 
    , worker_id number not null 
    , employing_state number not null 
    , constraint stn_mnt_pk primary key (station_id, worker_id) 
    , constraint stn_mnt_uk unique (station_id) 
    , constraint stn_mnt_stn_fk foreign key (station_id) 
      references station (station_id) 
    , constraint stn_mnt_wrk_fk foreign key (worker_id) 
      references worker (worker_id) 
    , constraint stn_mnt_state_ck check (station_state = employing_state) 

;

UNIQUE 키를 사용하면 각 스테이션마다 유지 관리자가 하나만있을 수 있습니다. 나는 하나의 작업이 하나 이상의 스테이션을 유지 관리 할 수있다.

외부 키가 실제 기본 키와 상태를 참조 할 수 있도록 두 테이블에서 고유 키가 필요하다. 이것은 피하는 것이지만 교차 테이블의 STATE 열이 부모의 STATE 열과 일치하는지 확인합니다.


게시 한 CHECK의 실제 테이블은 혼란 스럽습니다. STATION에 WORKER와 STATE를 연결하는 방법이 없으므로 테이블이 어떻게 관련되어 있는지 추측했습니다. 내 추측이 실제 모델과 일치하지 않는다면 불평하지 말고 질문을 수정하여 정확하고 충분한 세부 정보를 제공하십시오.