| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1472 人关注过本帖
标题:关于UPDATE的一点问题
取消只看楼主 加入收藏
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:10 
关于UPDATE的一点问题
在FOXPRO8.0中执行以下程序段:
SET TALK OFF
SET SAFETY OFF
SET EXACT ON
CLEAR ALL
CLOSE DATABASES
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
Y=STR(X,1)
APPEND BLANK
REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6  &&产生二个表 L1、L2,L2 是L1的部分记录
INDEX ON A3 TAG A1
SELECT 0
USE L2
INDEX ON A3 TAG A1
SELECT L1
SET RELATION TO A3 INTO L2

UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3 && 想把 L1中A1字段的记录替换为L2中的A2字段的记录,条件是A3字段相同。

原以为 A3=1、2、3、4、5 共5个记录都会替换,实际仅 A3=1 一条记录进行替换,不知为什么。UPDATE 在有些场合会达到符合条件的记录都替换,但是在上述例题中,不知为何失效。
搜索更多相关主题的帖子: 记录 
2012-02-06 16:18
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢软件服务老师关注,但是执行 UPDATE L1 SET A1=L2.A2 FROM L2 WHERE L1.A3=L2.A3 的效果和 UPDATE L1 SET L1.A1=L2.A2 FROM L2 WHERE L1.A3=L2.A3 一样,都是仅 A3=1 一条记录进行替换。
2012-02-07 07:57
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢茵梦湖老师关注。 9.0的代码 UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 确实达到预期效果。都是不知为什么8.0不能稳定达到效果。此前我也曾经在此论坛提到过这个问题,茵梦湖老师也是如此答复过我,对此我十分感谢。因为我主要使用8.0版本,因此我需要判定8.0中是否能可靠使用这个命令。因为在不少程序段使用,还是能达到效果,但是在上述例题中不知为什么不能达到效果。

例如我在某个程序中,有如下语句:
USE LC4  &&部分数据
INDEX ON STR(A28)+A12+A15+A18 TAG A12
SELE 0
USE LC2 &&全部数据(含LC4记录,但是缺少A26字段的数据。LC2需要补充LC4中A26字段的数据。)
INDEX ON STR(A28)+A12+A15+A18 TAG A12
GO TOP
SET RELATION TO STR(A28)+A12+A15+A18 INTO LC4
UPDATE LC2 SET LC2.A26=LC4.A26 WHERE LC2.A28=LC4.A28 .AND. LC2.A12=LC4.A12 .AND. LC2.A15=LC4.A15 .AND. LC2.A18=LC4.A18 &&A26发票数
就能很好达到效果,又为什么呢?

2012-02-07 08:28
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢TonyDeng老师。你说:要實現聯動,指定SET RELATION關聯,讓兩個表的記錄指針用A3匹配。
我在例题中用这样的语句:
....
INDEX ON A3 TAG A1
SELECT 0
USE L2
INDEX ON A3 TAG A1
SELECT L1
SET RELATION TO A3 INTO L2
...
是不是已经指定了关联,用A3匹配。
其实在上述例题中,我用 REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 语句 代替 UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3   ,就能很好达到效果。说明指针作用、转移是正常的。

此外很抱歉,你的英文答复,我有点看不懂。我还是很感谢你。你的帖子对我帮助很大。

2012-02-07 08:41
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢sdta老师指导,按照你的思路,取消了L1、L2的索引 INDEX ON A3 TAG A1 ,程序得到预期的效果。看来如你所说,不稳定的原因和索引有关。不知为什么。
2012-02-07 11:24
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
取消了L1、L2的索引 INDEX ON A3 TAG A1 ,程序得到预期的效果。看来不稳定的原因和索引有关。不知为什么。
但是对程序稍微做一变动,程序还是没有得到预期的效果。
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
CD D:\BDS
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
Y=STR(X,1)
APPEND BLANK
REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6
*INDEX ON A3 TAG A1 &&取消索引
SELECT 0
USE L2
DELETE FOR A3=3 &&稍微做一变动
PACK
*INDEX ON A3 TAG A1 &&取消索引
SELECT L1
SET RELATION TO A3 INTO L2
UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3
*REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 &&此语句在有索引时有效
BROWSE

看来取消索引是不行的,不稳定的原因没有真正解决。
2012-02-07 13:49
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢TonyDeng的关注,根据你的意见修改程序如下:
SET TALK OFF
SET SAFETY OFF
SET CENTURY ON
SET EXACT ON
SET DATE YMD
SET SYSMENU OFF
CLEAR ALL
CLOSE DATABASES
CD D:\BDS
CREATE DBF L1 (A1 C(10), A2 C(10),A3 N(2)) &&建立表
FOR X=1 TO 8
Y=STR(X,1)
APPEND BLANK
REPLACE A1 WITH 'SJA'+Y,A2 WITH 'SJB'+Y,A3 WITH X
ENDFOR
COPY TO L2 FOR A3<6
INDEX ON A3 TAG A1
SELECT 0
USE L2
DELETE FOR A3=3
PACK
INDEX ON A3 TAG A1
*SELECT L1
SET RELATION TO A3 INTO L1
SELECT L1
*UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 &&此命令在9.0可以,8.0出错
UPDATE L1 SET L1.A1=L2.A2 WHERE L1.A3=L2.A3
*REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3  &&此命令在更改关联方法后也不能达到预想的目的
BROWSE
RETURN

程序不能达到预想的目的。请TonyDeng试试。









*REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3
BROWSE
AA
RETURN
2012-02-07 14:05
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
TonyDeng老师,程序是根据你的:
...
SELECT 0
USE L2
DELETE FOR A3=3
PACK
INDEX ON A3 TAG A1
*SELECT L1
SET RELATION TO A3 INTO L1
....

请你执行一下,看看效果。
2012-02-07 14:26
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
TonyDeng老师,您在16楼说:SET RELATION指令,是指定當前工作區的數據表指針跟隨INTO參數工作區中的表指針移動,後者動了,本區就動,但本區動,後者不會動。因為你的需要在移動L1記錄指針的時候跟著動L2的,所以在SELECT L2後設置SET RELATION ……INTO L1即可。

在22楼中,你設置
SELECT L1
SET RELATION TO A3 INTO L2

是不是经过探讨,结论是 :
要想达到预想的目的,排序是必要的;SET RELATION TO A3 INTO L2 的关联是正确的;REPLACE ALL L1.A1 WITH L2.A2 FOR L1.A3=L2.A3 可以达到预想的目的;UPDATE L1 SET A1 = L2.A2 WHERE L1.A3=L2.A3 是不稳定的。





2012-02-07 15:04
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢lygcw9603关注,要达到目的有许多方法,你的方法应该可行。我在此目的是想探讨8.0中 SQL UPDATE指令,以及它的正确用法。我经常发现我8.0使用SQL UPDATE指令有不稳定的现象,在某些程序段中可以很正常,在某些程序段中会出错。在此论坛我曾经提出过,没有解决疑问,因此出了个例题请老师们指教。
2012-02-07 15:14
快速回复:关于UPDATE的一点问题
数据加载中...
 
   



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

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