我试图更新一个有点棘手的表。让我试着解释.. 例如,这是表格数据
这是我想要更新col5的方式。 对于每条记录,检查col3是否有值,如果是,则检查该值是否在col2中。如果两个条件都满足,则得到col1的最大值,因为col2将有重复。 如果col3没有值,我们需要检查col4并与col2进行比较并得到col1。
例如:对于第5行,我将首先检查col3,它的值为'b',我将检查col2的值为'b',我有3个匹配的(col1 - id 2,7,9)将需要从col1取9并在第5行更新col5。
请建议您宝贵的想法/想法..
答案 0 :(得分:0)
我编写了第一个条件,你匹配col3(对于现有和未存在的条件),你可以类似地编写程序中的代码来匹配col4。
create or replace procedure proc_cal is
d_col1 varchar2(3);
d_col2 varchar2(3);
maxcol varchar2(3):= '0';
begin
for i in (select * from coldata) loop
dbms_output.put_line('in here '|| i.col3);
if (i.col3 is not null) then
dbms_output.put_line('value exists for col3 and is ' || i.col3);
for j in (select * from coldata) loop
if (j.col2 = i.col3) then
dbms_output.put_line('value exists for col2 and col1 value is ' ||
j.col1);
dbms_output.put_line('the prev maxcol is '|| maxcol);
if (maxcol < j.col1) then
dbms_output.put_line('checking');
maxcol := j.col1;
dbms_output.put_line('current maxcol is ' || maxcol);
end if;
end if;
end loop;
update coldata set col5 = maxcol where col3=i.col3;
dbms_output.put_line('max value update and is ' || maxcol);
maxcol:=0;
else
update coldata set col5 = null where col3=i.col3;
end if;
end loop;
end;
SCOTT@research 13-APR-15> select * from coldata;
COL COL COL COL COL
--- --- --- --- ---
1 a a
2 b c
3 a a 8
4 c c
5 a b 9
6 c b
7 b c e 10
8 a a
9 b b
10 c c
答案 1 :(得分:0)
将来,如果您可以为示例提供CREATE DDL和一些INSERT语句,那就太好了,但这是一个非过程性的解决方案。
CREATE TABLE t (
col1 NUMBER,
col2 VARCHAR2(1),
col3 VARCHAR2(1),
col4 VARCHAR2(1),
col5 NUMBER
);
INSERT INTO t VALUES (1, 'a', NULL, 'a', NULL);
INSERT INTO t VALUES (2, 'b', NULL, 'c', NULL);
INSERT INTO t VALUES (3, 'a', 'a', NULL, NULL);
INSERT INTO t VALUES (4, 'c', NULL, 'c', NULL);
INSERT INTO t VALUES (5, 'a', 'b', NULL, NULL);
INSERT INTO t VALUES (6, 'c', NULL, 'b', NULL);
INSERT INTO t VALUES (7, 'b', 'c', 'e', NULL);
INSERT INTO t VALUES (8, 'a', NULL, 'a', NULL);
INSERT INTO t VALUES (9, 'b', NULL, 'b', NULL);
INSERT INTO t VALUES (10, 'c', NULL, 'c', NULL);
UPDATE t t1
SET t1.col5 =
(SELECT MAX(t2.col1)
FROM t t2
WHERE t2.col2 = t1.col3)
WHERE t1.col3 IS NOT NULL;
SELECT *
FROM t;
/*
col col col col col
1 a a
2 b c
3 a a 8
4 c c
5 a b 9
6 c b
7 b c e 10
8 a a
9 b b
10 c c
*/