我在更新一些记录时犯了一个错误,需要一些帮助来"恢复"它们。对于以下数据,我需要EC和INVOICE_NUM关键字具有迭代器后缀,如下所示。
如何迭代所有记录,并为EC和INVOICE_NUM关键字的值>1的每个RID执行此操作?如果只有一个EC或INVOICE_NUM,则不需要更新,可以保留为EC或INVOICE_NUM。
生产中:
RID KEYWORD VALUE
692307 BANK_NUM 17
692307 CHECK_AMT $ 2504.62
692307 CHECK_DT 71121
692307 CHECK_NUM 27034
692307 DOC_NAME Expense-Check
692307 EC 71103CTRC
692307 EC 71027TNRF
692307 EC 71114TXWCS
692307 EC 71117TXCP
692307 EC 7111ONJAD
692307 FILENAME Q:teleform 0028076
692307 INVOICE_NUM 2193000086
692307 INVOICE_NUM 9190000875
692307 INVOICE_NUM 9600010418
692307 INVOICE_NUM 9600010414
692307 INVOICE_NUM 8100000372
692307 VEND_NAME KINKO'S INC.
692307 VEND_NUM 1002838
期望结果:
RID KEYWORD VALUE
692307 BANK_NUM 17
692307 CHECK_AMT $ 2504.62
692307 CHECK_DT 71121
692307 CHECK_NUM 27034
692307 DOC_NAME Expense-Check
692307 EC_1 71103CTRC
692307 EC_2 71027TNRF
692307 EC_3 71114TXWCS
692307 EC_4 71117TXCP
692307 EC_5 7111ONJAD
692307 FILENAME Q:teleform 0028076
692307 INVOICE_NUM_1 9190000875
692307 INVOICE_NUM_2 2193000086
692307 INVOICE_NUM_3 9600010418
692307 INVOICE_NUM_4 9600010414
692307 INVOICE_NUM_5 8100000372
692307 VEND_NAME KINKO'S INC.
692307 VEND_NUM 1002838
同上的查询结果:
RID ORIGINAL_KEYWORD VALUE NEW_KEYWORD
3361978 DOC_NAME Expense-Check DOC_NAME_1
3361979 DOC_NAME Expense-Check DOC_NAME_2
3361980 DOC_NAME Expense-Check DOC_NAME_3
3361981 DOC_NAME Expense-Check DOC_NAME_4
3361982 DOC_NAME Expense-Check DOC_NAME_5
3361983 DOC_NAME Expense-Check DOC_NAME_6
3361984 DOC_NAME Expense-Check DOC_NAME_7
3361985 DOC_NAME Expense-Check DOC_NAME_8
3361986 DOC_NAME Expense-Check DOC_NAME_9
3361987 DOC_NAME Expense-Check DOC_NAME_10
*更多更新*
RID KEYWORD VALUE
5716220 BANK_NUMBER 17
5716220 CHECK_AMOUNT $ 3797.68
5716220 CHECK_DATE 141211
5716220 CHECK_NUMBER 67714
5716220 DOC_NAME Expense-Check
5716220 EVENT_CODE 141107NVCC
5716220 EVENT_CODE 141107NVCC
5716220 EVENT_CODE 141113FLRC
5716220 EVENT_CODE 141031INRA
5716220 EVENT_CODE 141107MSAM
5716220 EVENT_CODE 141113SCRCO
5716220 FILENAME Q:teleform 0133619
5716220 INVOICE_NUMBER DB791094
5716220 INVOICE_NUMBER 791094
5716220 INVOICE_NUMBER 792456
5716220 INVOICE_NUMBER 789983
5716220 INVOICE_NUMBER 791910
5716220 INVOICE_NUMBER 792452
5716220 VENDOR_NAME VTECH
5716220 VENDOR_NUMBER 1001685
5716221 BANK_NUMBER 17
5716221 CHECK_AMOUNT $ 3797.68
5716221 CHECK_DATE 141211
5716221 CHECK_NUMBER 67714
5716221 DOC_NAME Expense-Check
5716221 EVENT_CODE 141113SCRCO
5716221 EVENT_CODE 141113AZRAR
5716221 EVENT_CODE 141104MORER
5716221 FILENAME Q:teleform 01336191
5716221 INVOICE_NUMBER 792959
5716221 INVOICE_NUMBER 792508
5716221 INVOICE_NUMBER 790437
5716221 VENDOR_NAME VTECH
5716221 VENDOR_NUMBER 1001685
5716222 BANK_NUMBER 17
5716222 CHECK_AMOUNT $ 7782.73
5716222 CHECK_DATE 141211
5716222 CHECK_NUMBER 67711
5716222 DOC_NAME Expense-Check
5716222 EVENT_CODE
5716222 EVENT_CODE
5716222 FILENAME Q:teleform 0133616
5716222 INVOICE_NUMBER 150562
5716222 INVOICE_NUMBER 150533
5716222 VENDOR_NAME TGRAPH
5716222 VENDOR_NUMBER 1001672
结果应该是这样的:
RID KEYWORD VALUE
5716220 BANK_NUMBER 17
5716220 CHECK_AMOUNT $ 3797.68
5716220 CHECK_DATE 141211
5716220 CHECK_NUMBER 67714
5716220 DOC_NAME Expense-Check
5716220 EVENT_CODE_1 141107NVCC
5716220 EVENT_CODE_2 141107NVCC
5716220 EVENT_CODE_3 141113FLRC
5716220 EVENT_CODE_4 141031INRA
5716220 EVENT_CODE_5 141107MSAM
5716220 EVENT_CODE_6 141113SCRCO
5716220 FILENAME Q:teleform 0133619
5716220 INVOICE_NUMBER_1 DB791094
5716220 INVOICE_NUMBER_2 791094
5716220 INVOICE_NUMBER_3 792456
5716220 INVOICE_NUMBER_4 789983
5716220 INVOICE_NUMBER_5 791910
5716220 INVOICE_NUMBER_6 792452
5716220 VENDOR_NAME VTECH
5716220 VENDOR_NUMBER 1001685
5716221 BANK_NUMBER 17
5716221 CHECK_AMOUNT $ 3797.68
5716221 CHECK_DATE 141211
5716221 CHECK_NUMBER 67714
5716221 DOC_NAME Expense-Check
5716221 EVENT_CODE_1 141113SCRCO
5716221 EVENT_CODE_2 141113AZRAR
5716221 EVENT_CODE_3 141104MORER
5716221 FILENAME Q:teleform 01336191
5716221 INVOICE_NUMBER_1 792959
5716221 INVOICE_NUMBER_2 792508
5716221 INVOICE_NUMBER_3 790437
5716221 VENDOR_NAME VTECH
5716221 VENDOR_NUMBER 1001685
5716222 BANK_NUMBER 17
5716222 CHECK_AMOUNT $ 7782.73
5716222 CHECK_DATE 141211
5716222 CHECK_NUMBER 67711
5716222 DOC_NAME Expense-Check
5716222 EVENT_CODE_1
5716222 EVENT_CODE_2
5716222 FILENAME Q:teleform 0133616
5716222 INVOICE_NUMBER_1 150562
5716222 INVOICE_NUMBER_2 150533
5716222 VENDOR_NAME TGRAPH
5716222 VENDOR_NUMBER 1001672
该表的结构如上所示。数据来自需要更新的同一个表。
试试这样的东西:
with w_data as (
select 5716220 rid, rtrim('BANK_NUMBER ') keyword, rtrim('17 ') value from dual union all
select 5716220 rid, rtrim('CHECK_AMOUNT ') keyword, rtrim('$ 3797.68 ') value from dual union all
select 5716220 rid, rtrim('CHECK_DATE ') keyword, rtrim('141211 ') value from dual union all
select 5716220 rid, rtrim('CHECK_NUMBER ') keyword, rtrim('67714 ') value from dual union all
select 5716220 rid, rtrim('DOC_NAME ') keyword, rtrim('Expense-Check ') value from dual union all
select 5716220 rid, rtrim('EVENT_CODE ') keyword, rtrim('141107NVCC ') value from dual union all
select 5716220 rid, rtrim('EVENT_CODE ') keyword, rtrim('141107NVCC ') value from dual union all
select 5716220 rid, rtrim('EVENT_CODE ') keyword, rtrim('141113FLRC ') value from dual union all
select 5716220 rid, rtrim('EVENT_CODE ') keyword, rtrim('141031INRA ') value from dual union all
select 5716220 rid, rtrim('EVENT_CODE ') keyword, rtrim('141107MSAM ') value from dual union all
select 5716220 rid, rtrim('EVENT_CODE ') keyword, rtrim('141113SCRCO ') value from dual union all
select 5716220 rid, rtrim('FILENAME ') keyword, rtrim('Q:teleform 0133619 ') value from dual union all
select 5716220 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('DB791094 ') value from dual union all
select 5716220 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('791094 ') value from dual union all
select 5716220 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('792456 ') value from dual union all
select 5716220 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('789983 ') value from dual union all
select 5716220 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('791910 ') value from dual union all
select 5716220 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('792452 ') value from dual union all
select 5716220 rid, rtrim('VENDOR_NAME ') keyword, rtrim('VTECH ') value from dual union all
select 5716220 rid, rtrim('VENDOR_NUMBER ') keyword, rtrim('1001685 ') value from dual union all
select 5716221 rid, rtrim('BANK_NUMBER ') keyword, rtrim('17 ') value from dual union all
select 5716221 rid, rtrim('CHECK_AMOUNT ') keyword, rtrim('$ 3797.68 ') value from dual union all
select 5716221 rid, rtrim('CHECK_DATE ') keyword, rtrim('141211 ') value from dual union all
select 5716221 rid, rtrim('CHECK_NUMBER ') keyword, rtrim('67714 ') value from dual union all
select 5716221 rid, rtrim('DOC_NAME ') keyword, rtrim('Expense-Check ') value from dual union all
select 5716221 rid, rtrim('EVENT_CODE ') keyword, rtrim('141113SCRCO ') value from dual union all
select 5716221 rid, rtrim('EVENT_CODE ') keyword, rtrim('141113AZRAR ') value from dual union all
select 5716221 rid, rtrim('EVENT_CODE ') keyword, rtrim('141104MORER ') value from dual union all
select 5716221 rid, rtrim('FILENAME ') keyword, rtrim('Q:teleform 01336191') value from dual union all
select 5716221 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('792959 ') value from dual union all
select 5716221 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('792508 ') value from dual union all
select 5716221 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('790437 ') value from dual union all
select 5716221 rid, rtrim('VENDOR_NAME ') keyword, rtrim('VTECH ') value from dual union all
select 5716221 rid, rtrim('VENDOR_NUMBER ') keyword, rtrim('1001685 ') value from dual union all
select 5716222 rid, rtrim('BANK_NUMBER ') keyword, rtrim('17 ') value from dual union all
select 5716222 rid, rtrim('CHECK_AMOUNT ') keyword, rtrim('$ 7782.73 ') value from dual union all
select 5716222 rid, rtrim('CHECK_DATE ') keyword, rtrim('141211 ') value from dual union all
select 5716222 rid, rtrim('CHECK_NUMBER ') keyword, rtrim('67711 ') value from dual union all
select 5716222 rid, rtrim('DOC_NAME ') keyword, rtrim('Expense-Check ') value from dual union all
select 5716222 rid, rtrim('EVENT_CODE ') keyword, rtrim(' ') value from dual union all
select 5716222 rid, rtrim('EVENT_CODE ') keyword, rtrim(' ') value from dual union all
select 5716222 rid, rtrim('FILENAME ') keyword, rtrim('Q:teleform 0133616 ') value from dual union all
select 5716222 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('150562 ') value from dual union all
select 5716222 rid, rtrim('INVOICE_NUMBER') keyword, rtrim('150533 ') value from dual union all
select 5716222 rid, rtrim('VENDOR_NAME ') keyword, rtrim('TGRAPH ') value from dual union all
select 5716222 rid, rtrim('VENDOR_NUMBER ') keyword, rtrim('1001672 ') value from dual
)
select rid,
CASE WHEN keyword in ( 'EVENT_CODE', 'INVOICE_NUMBER' )
THEN
keyword || '_' || row_number() over (partition by rid, keyword order by value )
ELSE
keyword
END keyword,
value
from ( select rid, keyword, value,
count(*) over (partition by rid, keyword) rcount
from w_data
)
/
RID KEYWORD VALUE
---------- ------------------------------ ----------------------
5716220 BANK_NUMBER 17
5716220 CHECK_AMOUNT $ 3797.68
5716220 CHECK_DATE 141211
5716220 CHECK_NUMBER 67714
5716220 DOC_NAME Expense-Check
5716220 EVENT_CODE_1 141031INRA
5716220 EVENT_CODE_2 141107MSAM
5716220 EVENT_CODE_3 141107NVCC
5716220 EVENT_CODE_4 141107NVCC
5716220 EVENT_CODE_5 141113FLRC
5716220 EVENT_CODE_6 141113SCRCO
5716220 FILENAME Q:teleform 0133619
5716220 INVOICE_NUMBER_1 789983
5716220 INVOICE_NUMBER_2 791094
5716220 INVOICE_NUMBER_3 791910
5716220 INVOICE_NUMBER_4 792452
5716220 INVOICE_NUMBER_5 792456
5716220 INVOICE_NUMBER_6 DB791094
5716220 VENDOR_NAME VTECH
5716220 VENDOR_NUMBER 1001685
5716221 BANK_NUMBER 17
5716221 CHECK_AMOUNT $ 3797.68
5716221 CHECK_DATE 141211
5716221 CHECK_NUMBER 67714
5716221 DOC_NAME Expense-Check
5716221 EVENT_CODE_1 141104MORER
5716221 EVENT_CODE_2 141113AZRAR
5716221 EVENT_CODE_3 141113SCRCO
5716221 FILENAME Q:teleform 01336191
5716221 INVOICE_NUMBER_1 790437
5716221 INVOICE_NUMBER_2 792508
5716221 INVOICE_NUMBER_3 792959
5716221 VENDOR_NAME VTECH
5716221 VENDOR_NUMBER 1001685
5716222 BANK_NUMBER 17
5716222 CHECK_AMOUNT $ 7782.73
5716222 CHECK_DATE 141211
5716222 CHECK_NUMBER 67711
5716222 DOC_NAME Expense-Check
5716222 EVENT_CODE_1
5716222 EVENT_CODE_2
5716222 FILENAME Q:teleform 0133616
5716222 INVOICE_NUMBER_1 150533
5716222 INVOICE_NUMBER_2 150562
5716222 VENDOR_NAME TGRAPH
5716222 VENDOR_NUMBER 1001672
46 rows selected.
[编辑]根据以下内容更新。并更好地匹配预期结果[/edit]
WITH子句只是在创建您的数据。。。您可以省略它,并将"from wdata"更改为您的表。
内部查询只获取数据,并统计每个"组"中不同关键字的出现次数。
外部查询使用CASE将计数器仅附加到EVENT_CODE和INVOICE_NUMBER。那里的新列为每个组使用row_number,并将其全部切片。
您可以将该查询返回到MERGE语句中,以获得最简单的更新方法:
MERGE INTO <yourtable> base
USING ( <query above>
) new
ON ( new.rid = base.rid
and new.value = base.value
and new.original_keyword = base.keyword )
WHEN MATCHED THEN UPDATE
SET base.keyword = new.keyword
/
希望下面的帮助:
declare
INCR NUMBER:=1;
INCR1 NUMBER:=1;
CNT_EC NUMBER;
CNT_INV NUMBER;
begin
SELECT COUNT(KEYWORD) INTO CNT_EC FROM TABLE WHERE KEYWORD='EC';
SELECT COUNT(KEYWORD) INTO CNT_INV FROM TABLE WHERE KEYWORD='INVOICE_NUM';
IF CNT_EC>1THEN
FOR I IN(SELECT rid,keyword,value from table where rid>1 and keyword='EC') LOOP
UPDATE TABLE SET KEYWORD=I.KEYWORD||'_'||INCR AND KEYWORD=I.KEYWORD AND VALUE=I.VALUE and rid=i.rid;
INCR:=INCR+1;
END LOOP;
END IF;
IF CNT_INV>1 THEN
FOR J IN(SELECT rid,keyword,value from table where rid>1 and keyword='INVOICE_NUM') LOOP
UPDATE TABLE SET KEYWORD=J.KEYWORD||'_'||INCR1 AND KEYWORD=J.KEYWORD AND VALUE=J.VALUE and rid=j.rid;
INCR:=INCR1+1;
END LOOP;
END IF;
END;
**