| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7356 人关注过本帖, 1 人收藏
标题:求助:SQL 的Update命令,在VFP中到底应该怎样写?
只看楼主 加入收藏
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:17 
求助: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的知识,谢谢大家。
搜索更多相关主题的帖子: 中文 百度 Oracle 
2013-02-16 01:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
顶顶

授人以渔,不授人以鱼。
2013-02-16 12:55
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:2 
建议用select语句来组成一个新表来替代。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-02-16 13:06
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
回楼上的,用select组成新表可以成功,而且要用左连接,不然会丢失字段,您的办法我知道,但是当数据量大的时候,总不能每天都生成新表吧?
还是想用UPdate来做,我搞不明白的是,在Access和 FoxTable2012中能运行的语句,为什么在VFP中就不行?
我的电脑上还没VFP9.0,我一直用的是8.0,难道是版本的原因吗?
2013-02-16 13:34
wzxc
Rank: 9Rank: 9Rank: 9
来 自:齐鲁大地
等 级:贵宾
威 望:39
帖 子:985
专家分:1296
注 册:2006-4-25
收藏
得分:3 
UPDATE ckddmx set ckddmx.wlms4sql = jxk.pname from jxk where ALLTRIM(ckddmx.wldm) = ALLTRIM(jxk.pcode)

楼主,图片中第二个表名可是“jixingku”哟。

认真看书学习,弄通Fox主义。
2013-02-16 13:37
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:5 
在9.0中可以用语句:UPDATE T1 SET Wlms4sql=T2.Pname FROM T2 WHERE T1.Wldm=T2.Pcode 一次性搞定,但是我不知道8.0支不支持其中的FROM子句(红色部分)。

如果8.0不支持UPDATE-SQL的FROM 子句,你可以试试以下语句,我在9.0下试验通过:
UPDATE T1 SET Wlms4sql=NVL((SELECT T2.Pname FROM T2 WHERE T2.pcode=T1.Wldm),"")

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 taifu945 于 2013-2-16 13:39 编辑 ]
2013-02-16 13:38
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
回复 5楼 wzxc
谢谢提醒,我传的图片有误,我的库名是jxk,这里可以不考虑名称造成的问题。
2013-02-16 13:41
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
回复 6楼 taifu945
谢谢这位热心朋友,我刚刚试过你的第二种方法,在8.0中的提示是:“函数名缺少)”
不过,既然你在9.0下能搞定,看来是我该放弃8.0的时候了。
2013-02-16 13:47
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
嗯,改用9.0吧。在SQL方面,9.0比低版本改进了不止一点点。不过,也不应该呀,从5.0版本开始,VFP就支持NVL()函数了。你复制第二条语句时,确定没有漏东西?

[ 本帖最后由 taifu945 于 2013-2-16 13:55 编辑 ]
2013-02-16 13:51
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:995
专家分:4966
注 册:2013-2-16
收藏
得分:0 
回楼上的:我在机器上是这样运行的:
UPDATE ckddmx SET ckddmx.wlms4sql=NVL((SELECT jxk.Pname FROM jxk WHERE jxk.pcode=ckddmx.wldm),"")
确定没有漏什么东西。

看来可能是因为8.0不支持From子句,如果我换成9.0,应该可以解决。

在知道原因的同时,我被另一个问题困扰:难道在8.0不支持From子句的情况下,用8.0的真的就不能解决这个问题吗?
或者说:假设在9.0尚未发布,大家都用8.0的时候,这样的问题就不能解决吗?

这里没有钻牛角尖的意思,纯是为了求知,欢迎各位继续讨论,讨论的标题就是:
假设在9.0尚未发布,大家都用8.0的时候,这样的问题该如何解决?

[ 本帖最后由 厨师王德榜 于 2013-2-16 13:57 编辑 ]
2013-02-16 13:55
快速回复:求助:SQL 的Update命令,在VFP中到底应该怎样写?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033881 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved