主题:请教一个update语句的写法~
coffeenight
[专家分:230] 发布于 2010-04-14 17:05:00
语句如下:
update a set a.c=(select b.c from b where b.b=a.b)
各字段不允许为 null
因为 a,b表结构一样,只是纪录不是完全匹配的,我只是想更新匹配的那部分数据
可是运行语句,总是跳出 字段不允许为null的错误提示
有办法避免吗?
谢谢朋友们
最后更新于:2010-04-14 17:06:00
回复列表 (共11个回复)
沙发
moz [专家分:37620] 发布于 2010-04-14 17:21:00
update a set a.c=b.c from b where b.b=a.b
板凳
deadfoxer [专家分:300] 发布于 2010-04-14 17:25:00
首先让我们一起喊"把简练进行到底!",喊完口号后我再把你的句子简一下:
update a set c = (select c from b where b=a.b)
因为字段不允许为null,但子查询的结果可能为空值,这就是就出现了楼主说的那样的问题.
问题的原因找到了,下面就说怎样解决问题.
好,我看到MOZ的贴子了,不用我说了,问题解决了,就是这一句.
update a set a.c=b.c from b where b.b=a.b
3 楼
coffeenight [专家分:230] 发布于 2010-04-14 23:03:00
呃。。。我用的是6.0.
上面的语句在6.0运行提示错误T-T, 应该是9.0的语法
另外,好奇怪,我现在使用下面这条语句,
update bscj set bscj.ywk1=(sele ywk1 from ywk1 where ywk1.ksbh=bscj.ksbh)
总是出现错误提示:“函数名缺少)”
怎么回事呀?
4 楼
deadfoxer [专家分:300] 发布于 2010-04-15 12:13:00
update bscj set ywk1=(sele ywk1 from ywk1 where ksbh=bscj.ksbh)
先把你的语句简化了一下成为上列句子,然后告诉你两种意外情况:
一种是子查询里可能会查出两个或以上不同的ywk1值;
一种情况是子查询中没查到ywk1值.
我想问题可能会出在上面两种情况上.
还有可能就是VFP6是否支持这个语句?可以肯定VFP9是支持的.
5 楼
coffeenight [专家分:230] 发布于 2010-04-15 13:24:00
实践证实,同样的句子在9.0下可用,看来是之前VFP版本太低支持不了所以才出现错误提示的。
6 楼
moz [专家分:37620] 发布于 2010-04-15 20:07:00
我看了一下6.0的帮助文档,Update-SQL没有From子句。
好像也没看见说明允许坎套使用SQL
建议使用其他方式。
7 楼
coffeenight [专家分:230] 发布于 2010-04-15 22:00:00
在6.0里,两表之间的数据更新是不是只能使用 scan + replace了?
8 楼
coffeenight [专家分:230] 发布于 2010-04-18 10:01:00
CLOSE ALL
use bscj ALIAS cj
SELECT 0
use ywk1 ALIAS ywk1
SELECT ywk1
do while !EOF()
IF not ISBLANK(ywk1) then
kh=ywk1.ksbh
ywkcj=ywk1
SELECT cj
LOCATE for ksbh=kh and ISBLANK(cj.ywk1)
IF FOUND()
REPLACE ywk1 with ywkcj
ENDIF
ENDIF
SELECT ywk1
SKIP
ENDDO
放上自己写的代码,替代UPDATE语句
9 楼
moz [专家分:37620] 发布于 2010-04-18 12:53:00
我觉得,利用索引,会方便快捷.
10 楼
coffeenight [专家分:230] 发布于 2010-04-19 20:58:00
惭愧。。。
排序我只会用sql 的order by
索引我是一点都不懂
更不用说如何把它写入代码
我来回复