PLSQL 加入更新语句
PLSQL Join on an Update statement
我正在尝试更新数据库中的一些信息,因为在有前缀的情况下错误地使用了姓氏。
我构建了以下内容:
UPDATE subject_detail_overall sdo
JOIN subject_detail_personal sdp ON sdo.subject_id = sdp.subject_id
SET name_lessformal =
IF (sdp.sex = 1) THEN
sdo.name_lessformal := substr(sdo.name_lessformal,1,7)||upper(substr(sdo.name_lessformal,8,1))||substr(sdo.name_lessformal,9)
ELSIF (sdp.sex = 2) THEN
sdo.name_lessformal := substr(sdo.name_lessformal,1,5)||upper(substr(sdo.name_lessformal,6,1))||substr(sdo.name_lessformal,7)
END IF
WHERE (sdp.sex = 1 OR sdp.sex = 2) AND
((sdp.name_birthnameprefix IS NOT NULL AND ((sdp.useofname = 2) OR (sdp.useofname = 3)))
OR (sdp.name_partnernameprefix IS NOT NULL) AND ((sdp.useofname = 1) OR (sdp.useofname = 4)))
这是当前面只有miss或mister时,将前缀首字母转为大写
useofname 是使用哪个姓氏以及使用的顺序(partnername-birthname,仅 partnername 等)
我似乎无法在那个地方使用连接,但我不知道如何重塑查询以使其有效。
- 您应该检查 MERGE INTO 语句。
- SQL 使用针对 IF 的 CASE 子句。
- 你应该忽略这么多或。对性能很不友好
你的sql可以是这样的。但我不能没有测试
表。
MERGE INTO subject_detail_overall sdo
USING (
SELECT subject_id, CASE WHEN dp.sex = 1
THEN
substr(sdo.name_lessformal,1,7)||upper(substr(sdo.name_lessformal,8,1))||substr(sdo.name_lessformal,9)
WHEN dp.sex = 2
THEN
substr(sdo.name_lessformal,1,5)||upper(substr(sdo.name_lessformal,6,1))||substr(sdo.name_lessformal,7)
END AS result
FROM subject_detail_personal sdp
WHERE (sdp.sex = 1 OR sdp.sex = 2) AND
((sdp.name_birthnameprefix IS NOT NULL AND ((sdp.useofname = 2) OR (sdp.useofname = 3)))
OR (sdp.name_partnernameprefix IS NOT NULL) AND ((sdp.useofname = 1) OR (sdp.useofname = 4)))
) base ON sdo.subject_id = base.subject_id
WHEN MATCHED THEN UPDATE SET name_lessformal = base.result
我正在尝试更新数据库中的一些信息,因为在有前缀的情况下错误地使用了姓氏。
我构建了以下内容:
UPDATE subject_detail_overall sdo
JOIN subject_detail_personal sdp ON sdo.subject_id = sdp.subject_id
SET name_lessformal =
IF (sdp.sex = 1) THEN
sdo.name_lessformal := substr(sdo.name_lessformal,1,7)||upper(substr(sdo.name_lessformal,8,1))||substr(sdo.name_lessformal,9)
ELSIF (sdp.sex = 2) THEN
sdo.name_lessformal := substr(sdo.name_lessformal,1,5)||upper(substr(sdo.name_lessformal,6,1))||substr(sdo.name_lessformal,7)
END IF
WHERE (sdp.sex = 1 OR sdp.sex = 2) AND
((sdp.name_birthnameprefix IS NOT NULL AND ((sdp.useofname = 2) OR (sdp.useofname = 3)))
OR (sdp.name_partnernameprefix IS NOT NULL) AND ((sdp.useofname = 1) OR (sdp.useofname = 4)))
这是当前面只有miss或mister时,将前缀首字母转为大写
useofname 是使用哪个姓氏以及使用的顺序(partnername-birthname,仅 partnername 等)
我似乎无法在那个地方使用连接,但我不知道如何重塑查询以使其有效。
- 您应该检查 MERGE INTO 语句。
- SQL 使用针对 IF 的 CASE 子句。
- 你应该忽略这么多或。对性能很不友好
你的sql可以是这样的。但我不能没有测试 表。
MERGE INTO subject_detail_overall sdo
USING (
SELECT subject_id, CASE WHEN dp.sex = 1
THEN
substr(sdo.name_lessformal,1,7)||upper(substr(sdo.name_lessformal,8,1))||substr(sdo.name_lessformal,9)
WHEN dp.sex = 2
THEN
substr(sdo.name_lessformal,1,5)||upper(substr(sdo.name_lessformal,6,1))||substr(sdo.name_lessformal,7)
END AS result
FROM subject_detail_personal sdp
WHERE (sdp.sex = 1 OR sdp.sex = 2) AND
((sdp.name_birthnameprefix IS NOT NULL AND ((sdp.useofname = 2) OR (sdp.useofname = 3)))
OR (sdp.name_partnernameprefix IS NOT NULL) AND ((sdp.useofname = 1) OR (sdp.useofname = 4)))
) base ON sdo.subject_id = base.subject_id
WHEN MATCHED THEN UPDATE SET name_lessformal = base.result