sql 해 혹 - 통 금 카드

13397 단어 sql일 하 다cache
너희 회사 직원 들 의 합 리 적 인 간소화 로 인해, 너 는 안전 주관 과 데이터베이스 관리 자 를 겸 하고 있다.직원 과 유효한 출입금지 카드 목록 을 만 들 고 싶 습 니 다.모든 직원 들 이 현재 몇 개의 장소 에서 일 하 느 냐 에 달 려 있다.
그 는 여러 개의 출입금지 카드 를 가지 고 있 을 수 있 지만, 한 번 에 한 가지 만 효과 가 있 을 수 있다.최신 출입 통제 카드 가 새 직장 에서 나 왔 기 때문에 이 카드 는 기본적으로 유효 하 다.모방 을 방지 하기 위해 서 출입 금지 카드 번 호 는 무 작위 입 니 다.
당신 의 임 무 는 직원 목록 을 만 드 는 것 입 니 다. 모든 직원 은 관련 된 효과 적 인 출입 통제 카드 가 필요 합 니 다.A 를 사용 하면 유효 (Active) 를 표시 하고, I 는 무효 (Inactive) 를 표시 합 니 다.
방법 1:
personel 표 삭제
drop table personel;
create table personel(
emp_id integer not null primary key,
emp_name varchar2(40) not null
);
create sequence personel_sequence 
increment by 1
start with 1
nomaxvalue 
nocycle
cache 10;
//alter table personel add constraints PK_personel_emp primary key(emp_id);
insert into personel values(personel_sequence.nextval,'liaobinxu');
insert into personel values(personel_sequence.nextval,'fenerdong');
insert into personel values(personel_sequence.nextval,'  ');
insert into personel values(personel_sequence.nextval,'  ');

출입금지 카드 배지 만 들 기
drop table Badges;
create table Badges(
    badge_id integer not null primary key,
    emp_id integer  not null references personel(emp_id),
    issued_date date not null,
    badge_status char(1) not null check(badge_status in('A','I')),
    check (1);
인용 하 다.
check (1 - - ORA - 02251: 하위 조회 가 허용 되 지 않 아 표 생 성 에 실 패 했 습 니 다.
많은 sql 제품 은 표 급 제약 을 지원 하지 않 습 니 다. select 제약 을 사용 합 니 다. Oacle 도 마찬가지 입 니 다. 그래서 마지막 check 을 제거 합 니 다.
create table Badges(
    badge_id integer not null primary key,
    emp_id integer  not null references personel(emp_id),
    issued_date date not null,
    badge_status char(1) not null check(badge_status in('A','I'))
);

데이터 삽입
create sequence badge_sequence
increment by 1
start with 1
nomaxvalue
nocycle
nocache;

badge id 를 badge sequence 시퀀스 로 삽입 한 nextval, issued date 는 sysdate 에 0 - 30 사이 의 무 작위 수 를 추가 합 니 다.
insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'I');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'A');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'A');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'A');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'A');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'A');

insert into Badges(badge_id, emp_id , issued_date,Badge_Status)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'A');

최근 차단 카드 상 태 를 & lsquo; A & rsquo 로 설정 하 는 방법 을 사용 합 니 다.
상태 보기
select badge_id, emp_id, to_char(issued_date,'yyyy-mm-dd hh24:mi:ss'),badge_status from badges order by emp_id;

                               BADGE_ID                                  EMP_ID TO_CHAR(ISSUED_DATE,'YYYY-MM-D BADGE_STATUS --------------------------------------- --------------------------------------- ------------------------------ ------------                                     9                                       1 2009-03-30 19:04:32            A                                     4                                       1 2009-04-14 19:04:32            I                                     3                                       1 2009-04-01 19:04:32            I                                     8                                       2 2009-03-29 19:04:32            A                                    10                                      2 2009-04-19 19:04:32            A                                     2                                       2 2009-04-08 19:04:32            I                                     12                                     2 2009-04-12 19:04:33            A                                     6                                      3 2009-04-16 19:04:32            I                                     5                                      3 2009-03-24 19:04:32            I                                     1                                      3 2009-03-29 19:04:32            I                                     6                                      3 2009-03-25 19:04:32            I                                    11                                     3 2009-04-15 19:04:32            A                                    7                                       4 2009-04-03 19:04:32            A 13 rows selected
업데이트 조건 을 구축 하기 위해
update badges set badge_status='I';
update Badges set badge_status ='A'where ('I'=all(select badge_status from badges b1 where Badges.emp_id =b1.emp_id))and (issued_date=(select  max(issued_date) from badges b2 where badges.emp_id =b2.emp_id))

업데이트 결과 보기
select * from badges order by emp_id, issued_date; 

                               BADGE_ID                                  EMP_ID ISSUED_DATE BADGE_STATUS --------------------------------------- --------------------------------------- ----------- ------------                                      2                                        1 2009/3/25 1 A                                      5                                        2 2009/3/30 1 I                                      12                                       2 2009/4/6 19 I                                      6                                        2 2009/4/8 19 I                                      3                                        2 2009/4/18 1 A                                      7                                        3 2009/4/11 1 I                                      4                                        3 2009/4/20 1 A                                      8                                        4 2009/3/29 1 I                                      10                                      4 2009/3/31 1 I                                      1                                        4 2009/4/7 19 I                                      9                                        4 2009/4/8 19 I                                      13                                       4 2009/4/9 19 I                                      11                                       4 2009/4/12 1 A 13 rows selected
방법 2 다른 방법 은 출입금지 카드 에 일련 번 호 를 배정 하고 min () 과 max () 순서 번 호 를 효과 적 인 출입금지 카드 로 사용 하 는 것 이다.
배지 삭제
drop table badges;
drop sequence badge_sequence;
--    
create sequence badge_sequence
increment by 1
start with 1
nomaxvalue
nocycle
nocache;

- badge 상 태 를 판단 하 는 badge status 때문에 badge seq 를 만 들 고 min () 과 max () 순서 번 호 를 유효한 접근 금지 카드 로 사용 합 니 다.
create table badges
(
    badge_id integer not null primary key ,
    emp_id integer not null references personel(emp_id),
    issued_date date not null,
    badge_seq integer not null check(badge_seq>0),
    unique(emp_id, badge_seq)
);
create sequence badge_increment_sequence 
increment by 1
start with 1
nomaxvalue
nocycle
noorder;
--   badge_id  badge_sequence   nextval,
-- issued_date sysdate  0-30      
insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert
into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),'badge_increment_sequence.nextval);

insert into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

insert into Badges(badge_id, emp_id , issued_date,Badge_seq)
values(badge_sequence.nextval,round(dbms_random.value(1,4)),sysdate+round(dbms_random.value(0,30)),badge_increment_sequence.nextval);

올 바른 차단 카드 를 표시 하기 위해 보 기 를 만 듭 니 다:
create view ActiveBadges(emp_id, badge_id)
as 
select emp_id, badge_id
from badges b1
where b1.badge_seq=
(select max(badge_seq) from badges b2
where b1.emp_id =b2.emp_id 
);

그러나 차단 카드 를 잃 어 버 린 후, 이 방법 은 시퀀스 번 호 를 복원 하기 위해 업데이트 작업 을 수행 해 야 합 니 다. 이 조 회 는 이렇게 할 필요 가 없 지만, 번호 가 잘 배열 되 어 있 는 것 을 보고 모든 직원 의 카드 총 수 를 조 르 기 쉽 습 니 다.
update badges 
set badge_seq=(
select count(*) from badges b1 
where badges.emp_id =b1.emp_id and badges.badge_seq>=b1.badge_seq
);

이 update 는 같은 직원 아래 같은 데 이 터 를 비교 하여 update 이전의 데 이 터 를 추출 한 다 는 뜻 입 니 다.
select * from badges order by badge_id, emp_id;

-- update 이후 데이터
select * from badges order by badge_id, emp_id;

좋은 웹페이지 즐겨찾기