同表内记录间的DB2更新语句
创始人
2024-07-17 00:21:14
0

下面为您介绍的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);
 

 

 

【编辑推荐】

DB2日期时间型数据类型介绍

分析DB2数据库的优势

DB2表空间管理

DB2数据库启动失败的解决方案

创建DB2管理服务器的两种情况

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...