최종 사용자가 자동화 된 &이되도록 스크립트를 수정하고 있습니다.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
이라는 일련 번호 (자동 증가)와 다른 규칙의 일련 번호에 대한 참조를 각각 추가했다.
제공 될 수있는 도움에 미리 감사드립니다.
나는 이것을 위해 'CASE'를 유지하고 싶을 것 같다. 어떤 종류의 루프없이 단락 회로 동작을 복제하는 것은 어려울 것입니다. 한 가지 가능성은 동적 SQL을 사용하고 각 시나리오에 대해 'CASE'기준으로 테이블을 채우는 것입니다. – JNK
내가 유지 관리하려는 유일한 사람이라면 보관 하겠지만 최종 사용자는 이러한 규칙을 조정할 방법이 필요합니다. 나는 당신의 다른 제안을 살펴볼 것입니다 - 감사합니다 – CheeseConQueso