Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 重写查询的建议_Sql_Db2 - Fatal编程技术网

Sql 重写查询的建议

Sql 重写查询的建议,sql,db2,Sql,Db2,我有一个包含100万条记录的表(TABLEA),记录从多个来源填充到此表(TABLEA)。 数据填充后,下游处理的记录 每当插入数据时,列标志的值都将为null,并且一旦其被下游处理,则列标志的值将为null 该标志的值将更新为Y 所以基本上我需要在下游处理记录之前进行检查 要求是,对于表A(FLAG='Y')和CODE='I'中已处理的记录,我需要进行检查 是否有其他具有相同COLB值且标志为null的记录。如果它在那里,我想更改代码class='D'(这意味着标记为删除)和标志=NULL 我

我有一个包含100万条记录的表(TABLEA),记录从多个来源填充到此表(TABLEA)。
数据填充后,下游处理的记录

每当插入数据时,列标志的值都将为null,并且一旦其被下游处理,则列标志的值将为null 该标志的值将更新为Y

所以基本上我需要在下游处理记录之前进行检查

要求是,对于表A(FLAG='Y')和CODE='I'中已处理的记录,我需要进行检查 是否有其他具有相同COLB值且标志为null的记录。如果它在那里,我想更改代码class='D'(这意味着标记为删除)和标志=NULL

我为这个写了一个合并,大概需要3个小时才能完成 跑我试着解释这个计划,但它没有给我任何建议。那么有没有办法重写这个查询呢

MERGE INTO TABLEA SRC
using
(select COLB from TABLEA where FLAG IS NULL) TGT
on(SRC.COLB=TGT.COLB and SRC.FLAG is not null and SRC.CODE='I')
when matched then update set 
CODE='D',FLAG = NULL;
commit;
这是我的输入记录,在执行合并查询之前

COLA     COLB  CODE FLAG
 -------------- --------- ---- ----
 10001   3060   I    Y
 10002   3548   I    Y
 10003   3566   I    Y
 10004   5093   I    Y
 10005   3548   I    Y
 10008   3060   I    NULL
我的输出应该如下所示。这里,第一条记录(已处理)和最后一条记录(尚未处理)的COLB值相同,因此在合并查询之后 这就是桌子的样子

COLA     COLB  CODE FLAG
 -------------- --------- ---- ----
 10001   3060   D    NULL
 10002   3548   I    Y
 10003   3566   I    Y
 10004   5093   I    Y
 10005   3548   I    Y
 10008   3060   I    NULL

您可以使用以下
UPDATE
语句:

update tablea a
set code = 'D', flag = null
where flag = 'Y' and code = 'I'
  and exists (
    select 1 from tablea b where b.colb = a.colb and b.flag is null
  );
为了[实质性]提高性能,您可以创建以下索引:

create index ix1 on tablea (flag, code);

create index ix2 on tablea (colb, flag);

当索引包含所有3个字段时,可以加快搜索速度,因此db2可以对搜索进行索引扫描,并且只在需要更新时才需要对表空间进行读/写操作。

谢谢,我将对此进行测试并查看性能。如果尚未设置,我认为可以通过使用另一个隔离级别(带RS/CS/UR)来加快搜索速度。。。