Oracle11g Oracle更新语句

Oracle11g Oracle更新语句,oracle11g,Oracle11g,我正在尝试更新一个有点棘手的表格。让我试着解释一下。。 这是表格数据 下面是我想如何更新col5。 对于每个记录,检查col3是否有值,如果是,则检查col2中的值。如果两个条件都满足,则获取col1的最大值,因为col2将有重复项。 如果col3没有值,我们需要检查col4并与col2进行比较,得到col1 例如:对于第5行,我将首先检查col3,它的值为'b',我将检查col2的值'b',我有3个匹配的col1-ID2,7,9需要从col1中获取9,并在第5行更新col5 请提出您有价值的想

我正在尝试更新一个有点棘手的表格。让我试着解释一下。。 这是表格数据

下面是我想如何更新col5。 对于每个记录,检查col3是否有值,如果是,则检查col2中的值。如果两个条件都满足,则获取col1的最大值,因为col2将有重复项。 如果col3没有值,我们需要检查col4并与col2进行比较,得到col1

例如:对于第5行,我将首先检查col3,它的值为'b',我将检查col2的值'b',我有3个匹配的col1-ID2,7,9需要从col1中获取9,并在第5行更新col5


请提出您有价值的想法。

我已经为您的第一个条件编写了代码,如果您将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

在将来,如果您可以为您的示例提供一个CREATEDDL和一些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 
*/