求助:SQL 的Update命令,在VFP中到底应该怎样写?
各位大侠新年好,本来我认为是一个简单的问题,但楞是折腾了我几天,该试的都试过了,百度也搜索了,百度上的关于UPdate的写法,多与SQL-Sever、Oracle、MYSQL相关,专门针对VFP讲的很少,所以查了半天,还是不是要领.特来请教:
先看图,我有两张自由表,一张是ckddmx(中文含义:出库订单明细),有wldm、wlms4sql、sl、dj、cjrq(中文含义:物料代码、物料描述、数量、单价、出具日期)这几个主要字段,其中wlms4sql字段为空,需要从另一个表中更新.
另一个表为jxk(中文含义:机型库),字段为:pcode、pname、level1(中文含义:物料代码、物料描述、属性)
我的软件环境为VFP8.0版.
现在需要把ckddmx中的wlms4sql字段更新,更新的数据由jxk中的pname来替换,两个表中的wldm、pcode字段含义是一样的,只是名称不同而已,这个字段是关键字。
以前我处理这类问题,主要是两种办法,都可以成功,
一、用VFP中的Scan+Locate+Replace+Endscan命令,循环把需要的字段替换掉,这个办法用了好多年,在数据量大的时候,有点吃力。
二、用VFP中的Set relation to +Replace 命令,两表建立临时关系,再替换,也能行。(我把这两种方法写上,一是证明我不是单纯求作业,二是不希望您的答案再提这两种方法了,我已经会了)
现在由于数据量大,想用效率更高的SQL命令,避免在一个库循环,因循环太费时间了,但新的尝试总是不能成功。
我先后试过以下10条语句,在VFP中执行后,都是出错,出错信息我写在语句下方:
1、
UPDATE ckddmx set ckddmx.wlms4sql = jxk.pname where ALLTRIM(ckddmx.wldm) = ALLTRIM(jxk.pcode)反馈信息:能运行成功,但只是一次更新一条记录,显然不是我想要的结果,我要的是一次全部更新。
2、
UPDATE ckddmx INNER JOIN jxk ON alltrim(ckddmx.wldm)=alltrim(jxk.pcode) SET ckddmx.wlms4sql = jxk.pname;反馈信息:命令中含有不能识别的短语或关键字。
3、
UPDATE ckddmx LEft JOIN jxk ON alltrim(ckddmx.wldm)=alltrim(jxk.pcode) SET ckddmx.wlms4sql = jxk.pname;反馈信息:命令中含有不能识别的短语或关键字。
4、
UPDATE ckddmx INNER JOIN jxk ON alltrim(ckddmx.wldm)=alltrim(jxk.pcode) SET ckddmx.wlms4sql = jxk.pname where alltrim(ckddmx.wldm)=alltrim(jxk.pcode);反馈信息:命令中含有不能识别的短语或关键字。
5、
UPDATE ckddmx LEFT JOIN jxk ON alltrim(ckddmx.wldm)=alltrim(jxk.pcode) SET ckddmx.wlms4sql = jxk.pname where alltrim(ckddmx.wldm)=alltrim(jxk.pcode);反馈信息:命令中含有不能识别的短语或关键字。
6、
UPDATE ckddmx SET ckddmx.wlms4sql = (SELECT pname FROM jxk WHERE (ckddmx.wldm = jxk.pcode)) WHERE EXISTS ( SELECT * FROM jxk WHERE (ckddmx.wldm = jxk.pcode))反馈信息:函数名缺少)
7、
update ckddmx set wlms4sql=(select jxk.pname from jxk where jxk.pcode=ckddmx.wldm) where exists (select pname from jxk where jxk.pcode=ckddmx.wldm)反馈信息:函数名缺少)
8、
UPDATE ckddmx SET ckddmx.wlms4sql = jxk.pname FROM jxk INNER JOIN jxk ON (ckddmx.wldm = jxk.pcode)反馈信息:命令中含有不能识别的短语或关键字。
9、
UPDATE ckddmx SET ckddmx.wlms4sql = jxk.pname WHERE EXISTS ( SELECT pname FROM jxk WHERE (ckddmx.wldm = jxk.pcode))
反馈信息:可以运行,但把wlms4sql字段的所有记录全更新成了一个相同的值了,显然也不是我要的结果。
10、
UPDATE ckddmx SET ckddmx.wlms4sql = jxk.pname WHERE EXISTS ( SELECT pname FROM jxk WHERE alltrim(ckddmx.wldm)=alltrim(jxk.pcode))反馈信息:SQL关联字段时出错。 注:这句比9、多用了一个ALLTRIM()
值得一提的是其中 2、3、4、5 四句,我自认为是正确的,我把这两个表导入到Access中,用Access中的SQL来运算,2、3、4、5、这四句都可以成功,能得到我要的效果。
另外,我还把这两个表导入到FoxTable2012中,用SQL窗口运行,也是没问题的,但为什么一到了VFP的界面,运行就会出错呢?真是百思不解。
PS:VFP中关于update,还有一条“UPDATE ON <字段> FROM <工作区号>|<数据库别名> REPLACE <字段1> WITH <表达式1> [ <字段2>”, 这里我们不讨论这个,因为这条算VFP的命令,不是SQL-UPDATE,而我现在只想知道关于SQL-UPdate的知识,谢谢大家。