如何用Informix SQL和Genero 4GL提取数据库列中不在临时表的名称?
提取Informix中names表独有的名称并插入临时表
纯Informix SQL实现
直接使用INSERT ... SELECT结合NOT EXISTS或LEFT JOIN即可批量完成差异提取与插入,不需要用IF语句(IF仅适用于变量级判断,无法处理列级批量对比)。
方法1:使用NOT EXISTS
INSERT INTO tmp_new_names (name) SELECT n.name FROM names n WHERE NOT EXISTS ( SELECT 1 FROM tmp_names tn WHERE tn.name = n.name );
该语句会查询names表中所有在tmp_names表中没有匹配name值的记录,直接插入到tmp_new_names的name列。
方法2:使用LEFT JOIN
INSERT INTO tmp_new_names (name) SELECT n.name FROM names n LEFT JOIN tmp_names tn ON n.name = tn.name WHERE tn.name IS NULL;
通过左连接关联两张表,tn.name IS NULL的记录即为names表独有的数据,提取后插入目标表。
Genero 4GL实现
可以直接嵌入SQL执行,也可以通过游标遍历处理:
方式1:直接执行批量插入SQL
MAIN -- 执行差异插入 EXECUTE IMMEDIATE " INSERT INTO tmp_new_names (name) SELECT n.name FROM names n WHERE NOT EXISTS ( SELECT 1 FROM tmp_names tn WHERE tn.name = n.name ) " -- 检查执行结果 IF SQLCA.SQLCODE <> 0 THEN DISPLAY "插入失败: 错误码=", SQLCA.SQLCODE, " 错误信息=", SQLCA.SQLERRM ELSE DISPLAY "成功插入 ", SQLCA.SQLROWCOUNT, " 条差异记录" END IF END MAIN
方式2:游标遍历逐行插入(适合需要额外处理的场景)
MAIN DEFINE v_name CHAR(64) -- 根据实际name字段类型和长度定义 -- 可选:清空目标临时表 EXECUTE IMMEDIATE "DELETE FROM tmp_new_names" -- 定义游标查询差异记录 DECLARE cur_unique_names CURSOR FOR SELECT n.name FROM names n WHERE NOT EXISTS ( SELECT 1 FROM tmp_names tn WHERE tn.name = n.name ) OPEN cur_unique_names FETCH cur_unique_names INTO v_name WHILE SQLCA.SQLCODE = 0 INSERT INTO tmp_new_names (name) VALUES (v_name) -- 检查单条插入状态 IF SQLCA.SQLCODE <> 0 THEN DISPLAY "插入记录 '", v_name, "' 失败: ", SQLCA.SQLERRM CONTINUE END IF FETCH cur_unique_names INTO v_name END WHILE CLOSE cur_unique_names DISPLAY "差异记录处理完成" END MAIN
内容的提问来源于stack exchange,提问作者tacosoos
相关产品推荐
相关产品推荐

