Informix跨表更新cde表no_lieu字段报错求助
解决Informix关联表更新语法问题
Informix的UPDATE语法和很多主流数据库(比如SQL Server、PostgreSQL)存在差异,你之前尝试的UPDATE ... FROM或带多表连接的子查询写法都不符合它的语法规范,以下是正确的实现方式:
方法1:带关联子查询的UPDATE
这种方式适合简单的关联更新,同时可以过滤目标表的条件:
UPDATE cde SET no_lieu = (SELECT art.lieu_prin FROM art WHERE art.no_art = cde.no_art) WHERE etat_lig IN ('1', '0') -- 可选:避免将无匹配art记录的cde.no_lieu设为NULL AND EXISTS (SELECT 1 FROM art WHERE art.no_art = cde.no_art);
注意点:
- 如果
art表中存在多条no_art相同的记录,子查询会返回多行导致报错,此时可以用聚合函数确保返回单行,比如:SET no_lieu = (SELECT MAX(art.lieu_prin) FROM art WHERE art.no_art = cde.no_art) - 若允许将无匹配的
no_lieu设为NULL,可以去掉AND EXISTS(...)这一行。
方法2:使用MERGE语句
Informix支持MERGE语法,适合更复杂的关联更新场景:
MERGE INTO cde USING art ON cde.no_art = art.no_art WHEN MATCHED AND cde.etat_lig IN ('1', '0') THEN UPDATE SET no_lieu = art.lieu_prin;
为什么你的之前的语句报错?
- 第一个语句的子查询返回的是多行结果集(通过
cde LEFT JOIN art得到),无法直接赋值给单个字段no_lieu; - 第二、四个语句用了
UPDATE ... FROM/JOIN的语法,这不是Informix支持的UPDATE格式; - 第三个语句未过滤
cde.etat_lig条件,且如果art中存在重复no_art记录,会因子查询返回多行报错,同时无匹配时会将no_lieu置为NULL(可能不符合你的需求)。
内容的提问来源于stack exchange,提问作者aloux
相关产品推荐
相关产品推荐

