同表內(nèi)記錄間的DB2更新語(yǔ)句
下面為您介紹的DB2更新語(yǔ)句用于同表內(nèi)記錄間的更新操作,該DB2更新語(yǔ)句供您參考,希望對(duì)您學(xué)習(xí)DB2更新語(yǔ)句方面能有所幫助。
兩個(gè)DB2更新語(yǔ)句,用于更新同表內(nèi)符合條件的其它記錄。數(shù)據(jù)結(jié)構(gòu)如下:
metadata_xt(id, subject_id, other_courseware_name, me_author, me_title, me_key, me_abstract)
其中id***;me_title也應(yīng)***,但沒(méi)有約束,因此有可能重復(fù)(但即便重復(fù),同一me_title值的不同記錄的其他字段必定相同,因此可以判作冗余,也即可以被過(guò)濾);其它均不***。所有字段非空。語(yǔ)句用于匹配的項(xiàng)為me_title,其模式可能為如下幾個(gè):
'第__講 精簡(jiǎn)版', '第_講 精簡(jiǎn)版', '第__講 %' and !contains '精簡(jiǎn)版'; '第_講 %' and !contains '精簡(jiǎn)版'; 其它不以'第'開(kāi)頭的模式。
語(yǔ)句如下,主要目的是將me_title為'第__講 精簡(jiǎn)版'的記錄以me_title為僅相同開(kāi)頭('第__講...')的另一條源記錄更新。更新后記錄為:
me_title:源記錄的me_title + ' (精簡(jiǎn)版)';
其它字段:源記錄的相應(yīng)字段值。
功能見(jiàn)注釋?zhuān)?/p>
-- 首先更新用于匹配的關(guān)鍵項(xiàng)之外的字段
UPDATE DB2ADMIN.metadata_xt AS a
SET (me_key, -- DB2中可以通過(guò)這種方式同時(shí)為多個(gè)字段賦值,具體緣由可能與values語(yǔ)句有關(guān),
me_abstract, -- 但是不確定,有待查證。
subject_id,
me_author
) =
-- 這里通過(guò)distinct保證返回***一條記錄。子句中的where可以保證返回***的me_title值,但是
-- 由于之前提到的有可能出現(xiàn)的me_title重復(fù)的錯(cuò)誤,需要在此處確保相同me_title僅返回一條記錄。
(SELECT distinct me_key, me_abstract, SUBJECT_ID, me_author
FROM DB2ADMIN.metadata_xt AS b
WHERE other_courseware_name = '房屋建筑學(xué)' -- 以該字段分組,每次update語(yǔ)句更新一組。
AND b.ME_TITLE like '第%' -- 忽略me_title不以'第'開(kāi)頭的其它記錄
AND -- 此處進(jìn)行兩條記錄之間的me_title模式匹配
( left (b.ME_TITLE, 6) = left (a.ME_TITLE, 6) -- 匹配前六個(gè)字符,如'第01講...'或'第55講...'
OR -- 若兩條記錄不都符合模式'第__講%',則源記錄應(yīng)為模式'第_講%',按如下匹配
( 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 = '房屋建筑學(xué)' -- 限定要更新記錄的分組
AND me_title LIKE '第__講 精簡(jiǎn)版' -- 這是要更新的記錄的模式
AND EXISTS -- 該語(yǔ)句非常重要,可以避免將無(wú)對(duì)應(yīng)源記錄的“精簡(jiǎn)版”記錄的相應(yīng)字段賦值為null。
(SELECT 1 -- 僅當(dāng)有匹配的源記錄時(shí)返回1
FROM DB2ADMIN.metadata_xt AS c
WHERE c.OTHER_COURSEWARE_NAME = '房屋建筑學(xué)' -- 同樣進(jìn)行限定,以下就與上面的子查詢(xún)完全相同了,目的也無(wú)二致
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);
-- 將所有其它字段更新完之后,再運(yùn)行一遍,更新關(guān)鍵項(xiàng):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 = '房屋建筑學(xué)'
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) || ' (精簡(jiǎn)版)' -- 關(guān)鍵項(xiàng)的修改:源me_title + ' (精簡(jiǎn)版)'
WHERE other_courseware_name = '房屋建筑學(xué)'
AND me_title LIKE '第__講 精簡(jiǎn)版'
AND EXISTS
(SELECT 1
FROM DB2ADMIN.metadata_xt AS c
WHERE c.OTHER_COURSEWARE_NAME = '房屋建筑學(xué)'
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日期時(shí)間型數(shù)據(jù)類(lèi)型介紹
分析DB2數(shù)據(jù)庫(kù)的優(yōu)勢(shì)