Chinaunix

标题: 关于update的疑惑 [打印本页]

作者: lang_zhong    时间: 2005-12-16 12:58
标题: 关于update的疑惑
表CPRIZE 的主键是badge
请看下面2个语句
UPDATE CPRIZE c SET c.DIRECSTD=
            (SELECT SUM(a.DIRECSTD) FROM CPRIZETWO a WHERE a.badge=c.badge)
          WHERE EXISTS (SELECT 1 FROM CPRIZETWO a WHERE a.badge=c.badge);

UPDATE CPRIZE c SET c.DIRECSTD=
            (SELECT SUM(a.DIRECSTD) FROM CPRIZETWO a WHERE a.badge=c.badge)
WHERE EXISTS (SELECT SUM(a.DIRECSTD) FROM CPRIZETWO a WHERE a.badge=c.badge);

原以为是一样的,运行的结果出乎意料
第二个语句居然跟下面语句一个效果,昏倒!
UPDATE CPRIZE c SET c.DIRECSTD=
            (SELECT SUM(a.DIRECSTD) FROM CPRIZETWO a WHERE a.badge=c.badge);

居然把cprize 中有而CPRIZETWO 中没有的人的DIRECSTD全部置空了
还请高手指点迷津
看了请顶一下,谢谢!
作者: doni    时间: 2005-12-16 13:01
CPRIZETWO中的DIRECSTD是不是可以为NULL的,如果是的,而且实际记录中SUM出来也有NULL的,那么问题就在这里了
作者: lang_zhong    时间: 2005-12-16 14:50
不是这样的,CPRIZETWO中的DIRECSTD是不可以为NULL的!
CREATE TABLE CPRIZETWO (
   BADGE     VARCHAR2 (5)  NOT NULL,
  DIRECSTD  NUMBER (9,2)  NOT NULL,
  REMARK    VARCHAR2 (50))

这么说吧
cprize表有三条数据  
badge  DIRECSTD
1            500
2            null
3            null
而CPRIZETWO有2条数据
badge  DIRECSTD
2            100
3             200
运行的结果是 cprize表的数据为
badge  DIRECSTD
1            null
2            100
3            200
不信可以试试看!怪哇?
作者: lang_zhong    时间: 2005-12-20 12:49
自己顶一下!请大家也顶一下




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2