0

私はSQLスクリプティング、特にOracleSQLスクリプティングにかなり慣れていません。テーブル内の最新のレコードを取得し、date属性を前の日付に変更する必要があるタスクがあります。

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

繰り返しになりますが、Cycle_ID120のExtract_DATEをCycle_ID119の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>));

私の質問は、どうすればこのスクリプトを単純化したり、よりクリーンまたは効率的にしたりできるかということです。

4

1 に答える 1

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

于 2012-12-15T10:35:05.157 に答える