【关键词】

UPDATE (子查询) SET、子查询赋值不兼容、YashanDB UPDATE 写法规范

【问题描述】

如下 UPDATE 语句在 Oracle 中可执行,在 YashanDB 中却报错或执行失败:

UPDATE ADMIN_AUTH_ORG T1
SET T1.ORG_ID_STAN = (
    SELECT T2.ID
    FROM STAN_ORG_DEPT_INFO T2
    WHERE T2.TYPE_ID = 'ORG'
      AND T1.ORG_ID = T2.ID
      AND T1.ORG_NAME = T2.NAME_SHORT
)
WHERE T1.ORG_ID_STAN IS NULL;

【问题根因】

YashanDB 当前版本(如 22.2.3.1)暂不支持子查询直接作为赋值来源的 UPDATE 写法,执行计划无法展开,导致报错或逻辑异常。

此功能预计将在后续版本中通过内核增强解决。

【改写方式(兼容写法)】

为保证兼容性,建议添加 EXISTS 子句,以便优化器能正确展开依赖关系:

UPDATE ADMIN_AUTH_ORG T1
SET T1.ORG_ID_STAN = (
    SELECT T2.ID
    FROM STAN_ORG_DEPT_INFO T2
    WHERE T2.TYPE_ID = 'ORG'
      AND T1.ORG_ID = T2.ID
      AND T1.ORG_NAME = T2.NAME_SHORT
)
WHERE T1.ORG_ID_STAN IS NULL
  AND EXISTS (
    SELECT 1
    FROM STAN_ORG_DEPT_INFO T2
    WHERE T2.TYPE_ID = 'ORG'
      AND T1.ORG_ID = T2.ID
      AND T1.ORG_NAME = T2.NAME_SHORT
);

改写要点:

原逻辑不变;

增加 EXISTS 子句明确条件依赖,优化器更易解析;

适配当前版本执行引擎。

【适用版本】
image.png

【迁移建议】

image.png


数据库砖家
1 声望0 粉丝