回 帖 发 新 帖 刷新版面

主题:请教一个update语句的写法~

语句如下:
update a set a.c=(select b.c from b where b.b=a.b)

各字段不允许为 null

因为 a,b表结构一样,只是纪录不是完全匹配的,我只是想更新匹配的那部分数据
可是运行语句,总是跳出 字段不允许为null的错误提示
有办法避免吗?
谢谢朋友们

回复列表 (共11个回复)

沙发

update a set a.c=b.c from b where b.b=a.b

板凳

首先让我们一起喊"把简练进行到底!",喊完口号后我再把你的句子简一下:
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 楼

呃。。。我用的是6.0. 
上面的语句在6.0运行提示错误T-T,  应该是9.0的语法

另外,好奇怪,我现在使用下面这条语句,
update bscj set bscj.ywk1=(sele ywk1 from ywk1 where ywk1.ksbh=bscj.ksbh)
总是出现错误提示:“函数名缺少)”
怎么回事呀?

4 楼

update bscj set ywk1=(sele ywk1 from ywk1 where ksbh=bscj.ksbh)
先把你的语句简化了一下成为上列句子,然后告诉你两种意外情况:
一种是子查询里可能会查出两个或以上不同的ywk1值;
一种情况是子查询中没查到ywk1值.
我想问题可能会出在上面两种情况上.
还有可能就是VFP6是否支持这个语句?可以肯定VFP9是支持的.

5 楼

实践证实,同样的句子在9.0下可用,看来是之前VFP版本太低支持不了所以才出现错误提示的。

6 楼

我看了一下6.0的帮助文档,Update-SQL没有From子句。
好像也没看见说明允许坎套使用SQL
建议使用其他方式。

7 楼

在6.0里,两表之间的数据更新是不是只能使用 scan + replace了?

8 楼

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 楼

我觉得,利用索引,会方便快捷.

10 楼

惭愧。。。
排序我只会用sql 的order by 
索引我是一点都不懂
更不用说如何把它写入代码

我来回复

您尚未登录,请登录后再回复。点此登录或注册