Plsql 用于将一个记录值设置为另一个记录值的Oracle PL/SQL脚本优化
我对SQL脚本非常陌生,尤其是Oracle SQL脚本。我有一个任务,需要获取表中最近的记录,并将date属性更改为以前的日期Plsql 用于将一个记录值设置为另一个记录值的Oracle PL/SQL脚本优化,plsql,oracle11g,Plsql,Oracle11g,我对SQL脚本非常陌生,尤其是Oracle SQL脚本。我有一个任务,需要获取表中最近的记录,并将date属性更改为以前的日期 Cycle_ID Extract_DATE ======== ============ 119 26-NOV-12 120 03-DEC-12 再次重申,我想将Cycle_ID 120的提取日期设置为Cycle_ID 119的提取日期 下面是我用来完成这项任务的脚本 update <table_name> s
Cycle_ID Extract_DATE
======== ============
119 26-NOV-12
120 03-DEC-12
再次重申,我想将Cycle_ID 120的提取日期设置为Cycle_ID 119的提取日期
下面是我用来完成这项任务的脚本
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>));
我的问题是,如何简化此脚本和/或使其更干净或更高效?我给您的解决方案有效,如果且仅当列循环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>
下面是一个测试转换,指示如何使用此查询更改表
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这是一条非常简单的SQL语句。我不确定问题是什么…它并不像你想象的那么简单,你假设Pk是一个没有间隔的递增整数。这是极不可能的情况…它似乎没有改变我正在使用的表中的任何内容。我不能精确地指出逻辑,但它说所有120行都更新了,但我没有看到任何区别。