2012-12-14 2 views
0

저는 SQL 스크립팅과 특히 Oracle SQL 스크립팅을 처음 접했습니다. 테이블에서 가장 최근 레코드를 가져와 날짜 속성을 이전 날짜로 변경해야하는 작업이 있습니다. 한 레코드 값을 다른 레코드 값으로 설정하기위한 Oracle PL/SQL 스크립트 최적화

Cycle_ID Extract_DATE 
======== ============ 
119   26-NOV-12 
120   03-DEC-12 

그래서 내가

Cycle_ID 119의 Extract_DATE에 Cycle_ID (120)의 Extract_DATE을 설정하려는 되풀이하는 여기에 내가 이러한 목표를 달성하기 위해 사용하고있는 스크립트입니다.

update <table_name> 
set extract_date = (SELECT EXTRACT_DATE 
        from <table_name> 
        group by cycle_counter_id, extract_date 
        having cycle_counter_id=(select max(cycle_counter_id)-1 from <table_name>)) 
where cycle_counter_id = (SELECT CYCLE_COUNTER_ID 
          from <table_name> 
          group by cycle_counter_id 
          having cycle_counter_id=(select max(cycle_counter_id) from <table_name>)); 

내 질문에 내가이 스크립트를 단순화하고 더 깨끗하게 또는 더 효율적으로 만들 수 있습니까?

+0

그것은 (아주 간단) 단일 SQL 문입니다. 나는 그 문제가 무엇인지 확신 할 수 없다. – FrustratedWithFormsDesigner

답변

0

의 I 당신이 작동주는 솔루션, 경우에만 경우, 열 을 cycle_id은 테이블의 기본 키입니다.

UPDATE pl_updatetest t1 
SET t1.extract_date = 
(
    SELECT t2.extract_date 
    FROM pl_updatetest t2 
    WHERE t1.cycle_id = t2.cycle_id + 1 
) 
WHERE t1.cycle_id <> (SELECT MIN(cycle_id) FROM pl_updatetest); 

다음은이 쿼리를 사용하여 테이블을 변경하는 방법을 나타내는 테스트 캐스트입니다.

DROP TABLE pl_updatetest; 
CREATE TABLE pl_updatetest 
(
    cycle_id  NUMBER  NOT NULL, 
    extract_date DATE  NOT NULL 
); 
ALTER TABLE pl_updatetest ADD CONSTRAINT PK_PL_UPDATETEST 
    PRIMARY KEY(cycle_id); 

INSERT ALL 
    INTO pl_updatetest(cycle_id, extract_date) 
     VALUES(100, TO_DATE('01-JAN-2012', 'DD-MON-YYYY')) 
    INTO pl_updatetest(cycle_id, extract_date) 
     VALUES(101, TO_DATE('02-JAN-2012', 'DD-MON-YYYY')) 
    INTO pl_updatetest(cycle_id, extract_date) 
     VALUES(102, TO_DATE('03-JAN-2012', 'DD-MON-YYYY')) 
    INTO pl_updatetest(cycle_id, extract_date) 
     VALUES(103, TO_DATE('04-JAN-2012', 'DD-MON-YYYY')) 
    INTO pl_updatetest(cycle_id, extract_date) 
     VALUES(104, TO_DATE('05-JAN-2012', 'DD-MON-YYYY')) 
    INTO pl_updatetest(cycle_id, extract_date) 
     VALUES(105, TO_DATE('06-JAN-2012', 'DD-MON-YYYY')) 
SELECT * FROM DUAL; 

Table dropped. 


Table created. 


Table altered. 


6 rows created. 

SQL> SELECT * FROM pl_updatetest; 

    CYCLE_ID EXTRACT_D 
---------- --------- 
    100  01-JAN-12 
    101  02-JAN-12 
    102  03-JAN-12 
    103  04-JAN-12 
    104  05-JAN-12 
    105  06-JAN-12 

6 rows selected. 

SQL> 

UPDATE pl_updatetest t1 
SET t1.extract_date = 
(
    SELECT t2.extract_date 
    FROM pl_updatetest t2 
    WHERE t1.cycle_id = t2.cycle_id + 1 
) 
WHERE t1.cycle_id <> (SELECT MIN(cycle_id) FROM pl_updatetest); 

5 rows updated. 

SQL> 
SQL> 
SQL> SELECT * FROM pl_updatetest; 
CYCLE_ID EXTRACT_D 
---------- ----------- 
100  01-JAN-12 
101  01-JAN-12 
102  02-JAN-12 
103  03-JAN-12 
104  04-JAN-12 
105  05-JAN-12 

6 rows selected. 

SQL> 

감사

Dariyoosh는

+0

당신이 알아내는 것만 큼 간단하지는 않다. 당신은 thePK가 간격이없는 증가하는 정수라고 가정했다. 이것이 사실 일 가능성은 낮습니다 ... – Ben

+0

내가 사용하는 테이블에서 아무것도 변경되지 않는 것 같습니다. 나는 논리를 정확히 지적 할 수는 없지만 모든 120 행이 업데이트되었다고하지만 나는 어떤 차이도 보이지 않는다고 말했다. –

관련 문제