我正在开发一个包含许多字段和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 |
+------+------+------+------+
假设组合键已超过Col1
到Col4
。想象一下Col1,Col2,Col3一起代表一个组ID。第一行的Col4
为X
,因此我需要从Col1 = 11
和Col2 = 21
以及Col3 = 31
的表格中选择所有记录。接下来因为第二行是12,22,32,' X',我需要选择Col1 = 11
和Col2 = 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';
但这不是更新任何行。
我真的很感激这个问题的一些帮助。
答案 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')