| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1472 人关注过本帖
标题:关于UPDATE的一点问题
只看楼主 加入收藏
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
结帖率:90.91%
收藏
已结贴  问题点数:20 回复次数:30 
关于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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
兩個表的指針都不同步移動,這個where條件怎可能生效。

授人以渔,不授人以鱼。
2012-02-06 16:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
UPDATE L1
表明是對表L1進行循環更新,記錄指針將要遍歷L1,執行實際動作的條件,是檢查記錄指針指向的記錄L1.A3是否等於L2中當前記錄的L2.A3,雖然L1的記錄指針在變動,但你沒有指示L2的記錄指針也跟著移動,連如何移動都無從猜測,VFP和SQL都不會主動作這種猜測,必定是維持L2記錄不變的。因此,L2不變,L2.A3恒為1,當然只更新了符合條件的1了,2、3、4、5都不符合指定的條件。要實現聯動,指定SET RELATION關聯,讓兩個表的記錄指針用A3匹配。

[ 本帖最后由 TonyDeng 于 2012-2-6 16:38 编辑 ]

授人以渔,不授人以鱼。
2012-02-06 16:36
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:4 

8.0版我没有用过, 9.0的代码应为如下:

UPDATE L1 SET L1.A1=L2.A2 from L2 WHERE L1.A3=L2.A3 && 想把 L1中A1字段的记录替换为L2中的A2字段的记录,条件是A3字段相同。
2012-02-06 17:08
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9813
专家分:27037
注 册:2012-2-5
收藏
得分:10 
回复 楼主 panpende
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的部分记录
UPDATE L1 SET L1.A1=L2.A2 FROM L2 WHERE L1.A3=L2.A3 && 想把 L1中A1字段的记录替换为L2中的A2字段的记录,条件是A3字段相同。

坚守VFP最后的阵地
2012-02-06 18:44
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:2 
UPDATE L1 SET A1=L2.A2 FROM L2 WHERE L1.A3=L2.A3
这样也可以
2012-02-06 22:07
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9813
专家分:27037
注 册:2012-2-5
收藏
得分:0 
以下是引用软件服务在2012-2-6 22:07:44的发言:

UPDATE L1 SET A1=L2.A2 FROM L2 WHERE L1.A3=L2.A3
这样也可以
同意楼上的方法

坚守VFP最后的阵地
2012-02-06 23:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
[FROM [FORCE] Table_List_Item[[, ...] | [JOIN [ Table_List_Item]]]
Specifies one or more tables containing the data for the update operation.

The FROM clause has the same syntax as in the SQL SELECT command except for the following restrictions:

The target table or cursor cannot be included in an OUTER join as a secondary table or cursor.

It should be possible to evaluate all other JOIN operations before performing a JOIN operation on the target table.

The target cursor cannot be the result from a subquery.

For more information, see SELECT - SQL Command.

FORCE specifies that the tables in the table list are joined in the order they appear in the FROM clause.

Note  
If FORCE is omitted, Visual FoxPro attempts to optimize the update operation. However, the update operation might be executed faster by including the FORCE keyword to disable Visual FoxPro update optimization.
 

授人以渔,不授人以鱼。
2012-02-07 05:43
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
快速回复:关于UPDATE的一点问题
数据加载中...
 
   



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

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