2011-09-26 2 views
1

최종 사용자가 자동화 된 &이되도록 스크립트를 수정하고 있습니다.SQL 선택에 사용되는 규칙 테이블 설계에 도움이 필요합니다.

이전에이 스크립트의 일부를 this SO 게시물에 언급했습니다.

his 답변에 설명되어 있으므로 SQL 문의 논리는 테이블과 조인의 조합으로 대체해야 동일한 최종 결과를 얻을 수 있습니다.

은 현재 스크립트가 자동으로 여러 변수를 포함하는 규칙의 복잡한 세트를 기반으로 학생들에게 고문을 할당합니다 다음과 같이


기본 상황과 목적

입니다.

직원 (고문 고용/해고), 전공 (프로그램 추가/제거) 및 신용 시간 제한 (고문 결정에 필요한 최소 시간)으로 인해 단말기 시나리오에 대한 규칙이 시간이 지남에 따라 변경됩니다.

이러한 규칙은 최종 사용자 (학장/부서장)가 터미널 시나리오를 관리 할 수 ​​있도록 스크립트/SQL 외부에서 유지 관리해야합니다.

이러한 규칙을 효과적으로 관리하려면 사용자 지정 테이블을 만들어야합니다. 여기


는 현재이 규칙을 적용하는 데 사용되는 SQL이다 :

SELECT DISTINCT  s.id stu_id, 
        stu_id.fullname stu_name, 
        p.major1 major, 
        p.minor1 minor, 
        s.reg_hrs, 
        NVL(st.cum_earn_hrs,0) ttl_hrs, 
        p.adv_id curr_adv_id, 
        adv_id.fullname curr_adv_name, 
        CASE WHEN (p.adv_id <> 35808 AND p.major1 = 'NS')     THEN (1165) 
          WHEN (p.adv_id = 35808 AND p.major1 = 'NS')     THEN (35808) 
          WHEN (p.adv_id = 9179 AND p.major1 = 'DART')     THEN (9179) 
          WHEN (p.minor1 IN ('RT','RESP') AND st.cum_earn_hrs >= 24) THEN (70897) 
          WHEN (p.major1 IN ('CDSC','CDSD'))       THEN (52125) 
          WHEN (p.major1 IN ('CA','CB'))        THEN (24702) 
          WHEN (p.minor1 = 'NURS')          THEN (51569) 
          WHEN (p.major1 = 'LEG')          THEN (13324) 
          WHEN (p.major1 = 'CC')          THEN (73837) 
          WHEN (p.major1 = 'CCRE')          THEN (1133) 
          WHEN ((p.adv_id IN (SELECT DISTINCT id FROM fac_rec WHERE stat = 'I')) 
            OR (st.cum_earn_hrs < 24 AND (p.adv_id||p.major1) IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat = 'A' AND max_stu > 0 AND min_hrs >= 24)) 
            OR (s.id NOT IN (SELECT DISTINCT stu.id FROM stu_acad_rec stu, sess_info si WHERE stu.yr = si.prev_yr AND stu.sess = si.prev_sess AND stu.reg_hrs > 0 AND stu.reg_stat IN ('C','R') AND stu.prog = 'UNDG')) 
            OR ((p.adv_id||p.major1) IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat <> 'A' OR max_stu <= 0)) 
            OR ((p.adv_id||p.major1) NOT IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat = 'A' AND max_stu > 0))) 
          THEN (9238) 
          ELSE (p.adv_id) 
        END  new_adv_id, 
        CASE WHEN (p.adv_id <> 35808 AND p.major1 = 'NS')     THEN ('Deborah') 
          WHEN (p.adv_id = 35808 AND p.major1 = 'NS')     THEN ('Veronica') 
          WHEN (p.adv_id = 9179 AND p.major1 = 'DART')     THEN ('Stella') 
          WHEN (p.minor1 IN ('RT','RESP') AND st.cum_earn_hrs >= 24) THEN ('Lisa') 
          WHEN (p.major1 IN ('CDSC','CDSD'))       THEN ('Joanne') 
          WHEN (p.major1 IN ('CA','CB'))        THEN ('Barbara') 
          WHEN (p.minor1 = 'NURS')          THEN ('Karen') 
          WHEN (p.major1 = 'LEG')          THEN ('Nancy') 
          WHEN (p.major1 = 'CC')          THEN ('Alberta') 
          WHEN (p.major1 = 'CCRE')          THEN ('Naomi') 
          WHEN ((p.adv_id IN (SELECT DISTINCT id FROM fac_rec WHERE stat = 'I')) 
            OR (st.cum_earn_hrs < 24 AND (p.adv_id||p.major1) IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat = 'A' AND max_stu > 0 AND min_hrs >= 24)) 
            OR (s.id NOT IN (SELECT DISTINCT stu.id FROM stu_acad_rec stu, sess_info si WHERE stu.yr = si.prev_yr AND stu.sess = si.prev_sess AND stu.reg_hrs > 0 AND stu.reg_stat IN ('C','R') AND stu.prog = 'UNDG')) 
            OR ((p.adv_id||p.major1) IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat <> 'A' OR max_stu <= 0)) 
            OR ((p.adv_id||p.major1) NOT IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat = 'A' AND max_stu > 0))) 
          THEN ('Staff') 
          ELSE (adv_id.fullname) 
        END  new_adv_name, 
        CASE WHEN (p.adv_id <> 35808 AND p.major1 = 'NS')     THEN ('NS majors not assigned to Veronica go to Debbie') 
          WHEN (p.adv_id = 35808 AND p.major1 = 'NS')     THEN ('NS majors stay with Veronica') 
          WHEN (p.adv_id = 9179 AND p.major1 = 'DART')     THEN ('DART majors stay with Stella') 
          WHEN (p.minor1 IN ('RT','RESP') AND st.cum_earn_hrs >= 24) THEN ('RT-RESP minors go to Lisa') 
          WHEN (p.major1 IN ('CDSC','CDSD'))       THEN ('CDSC-CDSD majors go to Joanne') 
          WHEN (p.major1 IN ('CA','CB'))        THEN ('CA-CB majors go to Barbara') 
          WHEN (p.minor1 = 'NURS')          THEN ('NURS minors go to Karen') 
          WHEN (p.major1 = 'LEG')          THEN ('LEG majors go to Nancy') 
          WHEN (p.major1 = 'CC')          THEN ('CC majors go to Alberta') 
          WHEN (p.major1 = 'CCRE')          THEN ('CCRE majors go to Naomi') 
          WHEN (p.adv_id IN (SELECT DISTINCT id FROM fac_rec WHERE stat = 'I')) 
          THEN ('Current advisor is inactive') 
          WHEN (st.cum_earn_hrs < 24 AND (p.adv_id||p.major1) IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat = 'A' AND max_stu > 0 AND min_hrs >= 24)) 
          THEN ('Total credits for this student did not meet the advisor reqs for this major') 
          WHEN (s.id NOT IN (SELECT DISTINCT stu.id FROM stu_acad_rec stu, sess_info si WHERE stu.yr = si.prev_yr AND stu.sess = si.prev_sess AND stu.reg_hrs > 0 AND stu.reg_stat IN ('C','R') AND stu.prog = 'UNDG')) 
          THEN ('This student did not attend '||si.prev_sess||si.prev_yr) 
          WHEN ((p.adv_id||p.major1) IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE (stat <> 'A' OR max_stu <= 0))) 
          THEN ('Current advisor is not advising students with this major') 
          WHEN ((p.adv_id||p.major1) NOT IN (SELECT DISTINCT (id||major) FROM adv_detail WHERE stat = 'A' AND max_stu > 0)) 
          THEN ('Current advisor is not advising students with this major') 
          ELSE ('Student will stay with current advisor') 
        END  change_comm 
FROM    stu_acad_rec s, 
        prog_enr_rec p, 
        OUTER stu_stat_rec st, 
        id_rec stu_id, 
        id_rec adv_id, 
        sess_info si 
WHERE    s.id = p.id 
        AND s.id = st.id 
        AND s.id = stu_id.id 
        AND p.adv_id = adv_id.id 
        AND s.yr = si.curr_yr 
        AND s.sess = si.curr_sess 
        AND s.reg_hrs > 0 
        AND s.reg_stat IN ('C','R') 
        AND s.prog = 'UNDG' 
        AND p.prog = 'UNDG' 
        AND st.prog = 'UNDG' 
        AND s.id NOT IN (3,287,9238,59999) {System test use IDs} 
INTO TEMP   stu_list 
WITH NO LOG; 

나는이 모든 규칙을 저장할 테이블을 구축하기 위해 노력하고있어,하지만있는 테이블을 만든 적이 없다 이런 종류의 목적.

내 생각 지금까지 구조의 테이블은 다음과 같습니다

adv_assign_rules 
---------------- 
rule_no 
curr_adv_id 
major1 
major2 
minor1 
minor2 
cum_earn_hrs 
new_adv_id 
rule_desc 
rule_no_ref 
rule_stat 
rule_date 

처럼 보일 수있는 SQL 선택의 첫 번째 경우를 수용 할이 테이블의 예 행 :

rule_no   1 
curr_adv_id  !35808 
major1   =NS 
major2 
minor1 
minor2 
cum_earn_hrs 
new_adv_id  1165 
rule_desc  NS majors not assigned to 35808 go to Debbie 
rule_no_ref 
rule_stat  A 
rule_date  2011-09-26 15:02:26.000 

가 있습니까 그런 식탁에 결함이 있습니까? 이 유형의 설정은이 모든 규칙을 수용 할 수 있습니까? 누구든지 비슷한 목적으로 사용되는 테이블의 예제를 어디에서 찾을 수 있는지 알고 있습니까?

이 문제에 대한 개선 제안 및 대안을 찾고 있습니다. 이 경우 "else"시나리오는 학생 고문을 변경할 필요가 없음을 나타냅니다. 또한 가장 큰 로직 양을 가진 케이스 ("else"케이스의 마지막 케이스)는 새로운 권고자를 디폴트로 9238로 지정합니다. 이는 이미 다른 로직이 새 adivsor를 지정하는 데 사용됨을 나타냅니다. 이전의 모든 경우는 새 권고 자 지정 규칙을 따르지 않는 특수한 경우 인 기본 시나리오입니다. 이는 테이블 형식으로 다시 작성하려는 특수한 경우입니다.

업데이트 : 또한 재생산 및/또는 시나리오 기능을 찾고 있습니다. 나는 rule_no & rule_no_ref이라는 일련 번호 (자동 증가)와 다른 규칙의 일련 번호에 대한 참조를 각각 추가했다.

제공 될 수있는 도움에 미리 감사드립니다.

+0

나는 이것을 위해 'CASE'를 유지하고 싶을 것 같다. 어떤 종류의 루프없이 단락 회로 동작을 복제하는 것은 어려울 것입니다. 한 가지 가능성은 동적 SQL을 사용하고 각 시나리오에 대해 'CASE'기준으로 테이블을 채우는 것입니다. – JNK

+0

내가 유지 관리하려는 유일한 사람이라면 보관 하겠지만 최종 사용자는 이러한 규칙을 조정할 방법이 필요합니다. 나는 당신의 다른 제안을 살펴볼 것입니다 - 감사합니다 – CheeseConQueso

답변

-1

나는이 약간 다른 주위에 갈 것 :

1) 테이블 RULE_TYPE

id 
name 

2

) 테이블을 만들기를 만들기 가
id -- rule 
type -- relation to talbe 1 
name 
staff_group -- relation to the appropriate staff group for that rule 
student_group -- relation to the appropriate student group for that rule 
val_int --- for the rules that require numeric number 
val_chr --- for rules that require integer values 
val_date --- for date values rules 
date_start --- start date of a rule 
date_end --- end date of a rule 
가 가

당신은 또한 간격 paranters에 대한 필드를 만들 수 있습니다

을 rule_set X ... Y와 같은 정수 범위를 가짐 : val_int_start val_int_end 또는 기타

다음 규칙을 처리하는 저장 프로 시저를 작성하고 해당 데이터

을 평가하고 그 문제에 대한 연구 데이터 타입은

이 방법에 대한 좋은 생각은 정말 거의 장기적으로 새로운 무언가를 코딩 할 필요가 없습니다 것입니다

+0

답을 주셔서 감사합니다 ... 이것은 비교 속성 (예 : <>> = <= ==)을 고려하지 않으며 또한 어떤 필드를 정의하지 않는 것입니다 비교하기 위해서 – CheeseConQueso

관련 문제