下面为您介绍的DB2更新语句用于同表内记录间的更新操作,该DB2更新语句供您参考,希望对您学习DB2更新语句方面能有所帮助 。
两个DB2更新语句,用于更新同表内符合条件的其它记录 。数据结构如下:
metadata_xt(id, subject_id, other_courseware_name, me_author, me_title, me_key, me_abstract)
其中id唯一;me_title也应唯一,但没有约束,因此有可能重复(但即便重复,同一me_title值的不同记录的其他字段必定相同,因此可以判作冗余,也即可以被过滤);其它均不唯一 。所有字段非空 。语句用于匹配的项为me_title,其模式可能为如下几个:
第__讲 精简版, 第_讲 精简版, 第__讲 % and !contains 精简版; 第_讲 % and !contains 精简版; 其它不以第开头的模式 。
语句如下,主要目的是将me_title为第__讲 精简版的记录以me_title为仅相同开头(第__讲...)的另一条源记录更新 。更新后记录为:
me_title:源记录的me_title + (精简版);
其它字段:源记录的相应字段值 。
功能见注释:
-- 首先更新用于匹配的关键项之外的字段
UPDATE DB2ADMIN.metadata_xt AS a
SET (me_key, -- DB2中可以通过这种方式同时为多个字段赋值,具体缘由可能与values语句有关,
me_abstract, -- 但是不确定,有待查证 。
subject_id,
me_author
) =
-- 这里通过distinct保证返回唯一一条记录 。子句中的where可以保证返回唯一的me_title值,但是
-- 由于之前提到的有可能出现的me_title重复的错误,需要在此处确保相同me_title仅返回一条记录 。
(SELECT distinct me_key, me_abstract, SUBJECT_ID, me_author
FROM DB2ADMIN.metadata_xt AS b
WHERE other_courseware_name = 房屋建筑学 -- 以该字段分组,每次update语句更新一组 。
AND b.ME_TITLE like 第% -- 忽略me_title不以第开头的其它记录
AND -- 此处进行两条记录之间的me_title模式匹配
( left (b.ME_TITLE, 6) = left (a.ME_TITLE, 6) -- 匹配前六个字符,如第01讲...或第55讲...
OR -- 若两条记录不都符合模式第__讲%,则源记录应为模式第_讲%,按如下匹配
( substr(a.ME_TITLE,3,1)=0 and substr(a.me_title, 4,3)=substr(b.ME_TITLE, 3, 3) )
)
AND b.ME_TITLE <> a.ME_TITLE) -- 要求两字段值不同,避免同记录的更新
WHERE other_courseware_name = 房屋建筑学 -- 限定要更新记录的分组
AND me_title LIKE 第__讲 精简版 -- 这是要更新的记录的模式
AND EXISTS -- 该语句非常重要,可以避免将无对应源记录的“精简版”记录的相应字段赋值为null 。
(SELECT 1 -- 仅当有匹配的源记录时返回1
FROM DB2ADMIN.metadata_xt AS c
WHERE c.OTHER_COURSEWARE_NAME = 房屋建筑学 -- 同样进行限定,以下就与上面的子查询完全相同了,目的也无二致
AND c.ME_TITLE like 第%
AND
( left (c.ME_TITLE, 6) = left (a.ME_TITLE, 6)
OR
( substr(a.ME_TITLE,3,1)=0 and substr(a.me_title, 4,3)=substr(c.ME_TITLE, 3, 3) )
)
AND c.ME_TITLE <> a.ME_TITLE);
-- 将所有其它字段更新完之后,再运行一遍,更新关键项:me_title 。
UPDATE DB2ADMIN.metadata_xt AS a
SET me_title =
(SELECT distinct me_title
FROM DB2ADMIN.metadata_xt AS b
WHERE other_courseware_name = 房屋建筑学
AND b.ME_TITLE like 第%
AND
( left (b.ME_TITLE, 6) = left (a.ME_TITLE, 6)
OR
( substr(a.ME_TITLE,3,1)=0 and substr(a.me_title, 4,3)=substr(b.ME_TITLE, 3, 3) )
)
AND b.ME_TITLE <> a.ME_TITLE) || (精简版) -- 关键项的修改:源me_title + (精简版)
WHERE other_courseware_name = 房屋建筑学
AND me_title LIKE 第__讲 精简版
AND EXISTS
(SELECT 1
FROM DB2ADMIN.metadata_xt AS c
WHERE c.OTHER_COURSEWARE_NAME = 房屋建筑学
AND c.ME_TITLE like 第%
AND
( left (c.ME_TITLE, 6) = left (a.ME_TITLE, 6)
OR
( substr(a.ME_TITLE,3,1)=0 and substr(a.me_title, 4,3)=substr(c.ME_TITLE, 3, 3) )
)
AND c.ME_TITLE <> a.ME_TITLE);