写点什么

YashanDB|UPDATE 中用子查询赋值报错? 换个写法就能兼容

作者:数据库砖家
  • 2025-05-13
    广东
  • 本文字数:562 字

    阅读完需:约 2 分钟

【关键词】

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

【问题描述】

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

UPDATE ADMIN_AUTH_ORG T1SET 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 T1SET 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 子句明确条件依赖,优化器更易解析;

适配当前版本执行引擎。

【适用版本】

【迁移建议】


用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB|UPDATE 中用子查询赋值报错?换个写法就能兼容_数据库_数据库砖家_InfoQ写作社区