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