【关键词】
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 子句明确条件依赖,优化器更易解析;
适配当前版本执行引擎。
【适用版本】
【迁移建议】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。