FoxPro执行带WHERE条件的UPDATE子查询报错如何修复
FoxPro带WHERE条件更新的语法修正方案
你遇到的报错核心是FoxPro和MySQL的语法规则差异,原语句有两个关键语法错误:
- 字段名不能用单引号包裹:FoxPro中单引号是字符串常量的边界符,你写的
'Memo'会被识别为字符串而非字段名,是触发「function name is missing )」报错的直接原因 - FoxPro原生UPDATE语法不支持在SET子句后直接写嵌套SELECT标量子查询,和MySQL的语法支持逻辑不同
- 额外语法提示:FoxPro中
LIKE是模糊匹配运算符,如果要匹配以UBOA开头的内容需写为LIKE "UBOA%",如果是Keydoc完全等于"UBOA"的场景,直接用=判断效率更高
正确实现写法
最稳妥、最兼容的写法是先把要更新的目标值存入变量,再执行更新语句,避免跨工作区、子查询的语法兼容问题:
* 第一步:查询Keymemo匹配记录的Memo值,存入数组变量 SELECT Memo FROM expertcorr_memoinv WHERE Keymemo='10045223' INTO ARRAY laTargetMemo * 第二步:执行条件更新 UPDATE expertcorr_memoinv; SET Memo = laTargetMemo[1]; WHERE Keydoc = "UBOA" * 如果需要模糊匹配Keydoc以UBOA开头,把上面WHERE条件替换为: * WHERE Keydoc LIKE "UBOA%"
如果习惯用FoxPro原生的表操作命令,也可以用REPLACE写法实现:
* 在独立工作区打开取数源表 USE expertcorr_memoinv ALIAS source_tbl IN 0 SELECT source_tbl * 定位到Keymemo匹配的记录 LOCATE FOR Keymemo='10045223' * 切换回目标表执行批量替换 SELECT expertcorr_memoinv REPLACE ALL Memo WITH source_tbl.Memo FOR Keydoc = "UBOA"
注意:如果
Keymemo='10045223'匹配到多条记录,上述两种写法默认取第一条匹配记录的Memo值作为更新值,如果需要取特定记录请补充对应筛选条件。
内容的提问来源于stack exchange,提问作者yarek
相关产品推荐
相关产品推荐

