Oracle 11g更新了包含数百万条记录的表中的行

时间:2016-11-28 17:11:26

标签: sql oracle oracle11g

我正在开发一个包含许多字段和1亿个数据的表,并且在某些字段上有一个复合键。示例表 emp ,其中包含数百万行,如下所示:

+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------+
|   11 |   21 |   31 | X    |
|   12 |   22 |   32 | X    |
|   14 |   24 |   34 | X    |
|   11 |   21 |   31 | 555  |
|   11 |   21 |   31 | 551  |
|   12 |   22 |   32 | 89   |
|   14 |   24 |   34 | 45   |
+------+------+------+------+

假设组合键已超过Col1Col4。想象一下Col1,Col2,Col3一起代表一个组ID。第一行的Col4X,因此我需要从Col1 = 11Col2 = 21以及Col3 = 31的表格中选择所有记录。接下来因为第二行是12,22,32,' X',我需要选择Col1 = 11Col2 = 22以及Col3=32的所有行。对于Col4 =X

的所有情况都是如此

我尝试使用带光标的for循环,但由于该表有1亿个数据和复合键,所以需要花费很多时间。这需要很长时间。

我试过的循环语句的伪代码:

result= select Col1,Col2,Col3 from emp where `Col4=X`.
for each row in result
do
   finalresult += select * from table where Col1 = row.Col1 and Col2 = row.Col2 and Col3 = row.Col3
done

finalresult 拥有所有必需的数据。但这已经持续了很长时间。

此外,我尝试合并更新如下

    merge into emp t1
    using (select * from emp t where t.col4=X) t2
    on t1.col1=t2.col1
    and t1.col2=t2.col2
    and t1.col3=t3.col3
    when matched then update set col4=Y
and t1.col4!='X';

但这不是更新任何行。

我真的很感激这个问题的一些帮助。

1 个答案:

答案 0 :(得分:0)

select *
  from emp x
 where x.col4 != 'X'
   and exists (select 1
                 from emp y
                where x.col1 = y.col1
                  and x.col2 = y.col2
                  and x.col3 = y.col3
                  and y.col4 = 'X')