2012-12-14 30 views
0

我對SQL腳本編制,特別是Oracle SQL腳本編制相當陌生。我有一個任務,我需要獲取表格中的最新記錄並將日期屬性更改爲以前的日期。用於將一個記錄值設置爲另一個記錄值的Oracle PL/SQL腳本優化

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

所以要重申,我想爲Cycle_ID 120設置Extract_DATE到Cycle_ID 119

的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

,我給你工作的解決方案,當且僅當,列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

這並不像你所說的那麼簡單,你認爲PK是一個沒有間隙的遞增整數。這是非常不可能的...... – Ben

+0

它似乎沒有改變我使用的表中的任何東西。我無法查明邏輯,但它說所有120行已更新,但我沒有看到任何區別。 –

相關問題