有一个form,里面有两个table,要实现表1中的某个字段加到表2的某个字段,根据工号来连接.
要实现表1和表2中相同的工号它的金额的和,再放到表2中.
谢谢
为什么这句执行不了:
update yb1 set yb1.C4 = yb1.C4 + yb2.C2 from yb1,yb2 where yb1.C1=yb2.C1在oracle的sql\plus中也执行不了.谢谢

解决方案 »

  1.   

    update yb1 set C4=C4+(select C2 from yb2 where yb2.C1=yb1.C1);
      

  2.   

    PLSQL,T-SQL和Asni的语法的语法都不一样,尤其在连表更新时oracle,sqlserver和access区别很大
      

  3.   

    我用的数据库是oracle数据库,应该怎么写?
      

  4.   

    update yb1 set yb1.c4=yb1.c4+(select sum(yb2.c4) from yb2 where yb2.c1=yb1.c1)
    使用这句就可以了。
      

  5.   

    搞定:建立t2,t1如下图执行SQL> select * from t2;        C1         C2
    ---------- ----------
             1          2
             2          3
             3          1SQL> select* from t1;        C1         C2
    ---------- ----------
             1          2
             2          3
             3          1
             4          5SQL> update t1 set c2=c2+ (select c2 from 
      2    (select t1.c1,t1.c2 from t1,t2 where t1.c1=t2.c1
      3       union
      4     select c1,0 as c2 from t1 where c1 not in
      5         (select c1 from t2)) b
      6     where t1.c1=b.c1);4 rows updatedSQL> select * from t1;        C1         C2
    ---------- ----------
             1          4
             2          6
             3          2
             4          5SQL> commit;Commit complete
      

  6.   

    SQL> update yb1 set c4=c4+ (select c2 from 
      2    (select yb2.c1,yb2.c2 from yb2,yb1 where yb1.c1=yb2.c1
      3       union
      4     select c1,0 as c2 from yb1 where c1 not in
      5         (select c1 from yb2)) b
      6     where yb1.c1=yb2.c1);
    中间只是嵌套了一个带union的查询,前半部分是公共的,后半部分是yb2中没有的,所以按0加,这样就不会是null了
      

  7.   

    楼上这位兄台,万分感谢
    另一个上的分都给了,不过还有个问题,帮我解决一下,解决完了,再多给你一些你给的语句在sql\plus中可以了,可是在delphi中:
    query1.Close;
    query1.sql.Clear;
    query1.sql.add('update yb1 set c4=c4+(select c2 from (select c1c2c3.c1,c1c2c3.c2 from c1c2c3,yb1 where yb1.c1=c1c2c3.c1 union select c1,0 as c2 from yb1 where c1 not in (select c1 from c1c2c3)) b where yb1.c1=b.c1)');
    query1.Open;
    这个执行不了
      

  8.   

    query1.Open;这个是错的
    改成:
    query1.ExecSQL;
      

  9.   

    你其他的简单的update语句可以执行吗
      

  10.   

    query1.Close;
    query1.sql.Clear;
    query1.sql.add('update yb1 set C4=100 where C1=130339');
    query1.ExecSQL;
    这都执行不了
      

  11.   

    可能是bde内存访问有问题了,你把所有有关程序的都关掉,重新打开一下
      

  12.   

    要不你再看看程序吧
    query1.Close;
    query1.sql.Clear;
    query1.sql.add('update yb1 set c4=c4+(select c2 from (select c1c2c3.c1,c1c2c3.c2 from c1c2c3,yb1 where yb1.c1=c1c2c3.c1 union select c1,0 as c2 from yb1 where c1 not in (select c1 from c1c2c3)) b where yb1.c1=b.c1)');
    query1.Open;
      

  13.   

    query1.Close;
    query1.sql.Clear;
    query1.sql.add('update yb1 set c4=c4+(select c2 from (select c1c2c3.c1,c1c2c3.c2 from c1c2c3,yb1 where yb1.c1=c1c2c3.c1 union select c1,0 as c2 from yb1 where c1 not in (select c1 from c1c2c3)) b where yb1.c1=b.c1)');
    query1.execsql;
      

  14.   

    query1.Close;
    query1.sql.Clear;
    query1.sql.add('update yb1 set C4=100 where C1=130339');
    query1.ExecSQL;
    这都执行不了
    =======================================这个不是sql语句的问题了,报什么错误??是不是你的SQLPlus开着,里面有未提交的语句把表锁了?
      

  15.   

    提示:
    key violation
    [oracle][odbc][ora]ora-00600:内部错误代码.自变量:[kcbgcur-9][1][4200318][2][][][][]....
      

  16.   

    是不是表要建索引>?
    还是query要什么设置?
      

  17.   

    ORA-00600:internal error code,arguments:[num],[?],[?],[?],[?]
    产生原因:这种错误通常为ORACLE的内部错误,只对OSS和ORACLE开发有用。ORA-600的错误经常伴随跟踪文件的状态转储(系统状态和进程状态),系统状态存储将包括ORACLE RDBMS持有的当前对象的信息,进程状态转储则将显示特殊进程持有的对象,当进程符合了某错误条件时,经常是由于一些信息取自它持有的一个块,如果我们知道这些错误进程持有的块,就容易跟踪问题的来源。
    解决方法:一般来说出现这个错误我们本身是无法解决的,只有从提高系统本身各方面来解决这个内部问题,如增加硬件设备,调整系统性能,使用OPS(当然OPS从某种意义上说并不是一种好的解决方式)等。ORA-600错误的第一个变量用于标记代码中错误的位置(代码中的每个部分的第一变量都不一样),从第二个到第五个变量显示附加信息,告诉OSS代码在哪里出现了错误。
    一个报错例子如下:
    ORA-00600: internal error code, arguments: [1237], [], [], [], [], [], [], []
    你是怎么连接oracle的,改一下连接方式看看
      

  18.   

    query1.Close;
    query1.sql.Clear;
    query1.sql.add('update yb1 set C4=100 where C1=130339');
    query1.ExecSQL;
    这个报错是:无效字符
    query不是有个属性是databasename,我只设置了这个.
    我通常用table,其他的都没有用过
    我不是专业的开发员,领导让我做,我以前学过一点而已,很谢谢你
      

  19.   

    谢谢你
    不过query1.Close;
    query1.sql.Clear;
    query1.sql.add('select ......');
    query1.ExecSQL;
    能执行.
    就是刚才的这个不行
      

  20.   

    建立完索引可以了
    可是在程序里执行时出错,提示:error creatng cursor handle
      

  21.   

    好了,不过有个问题想问你:我做程序的时候用到了filter,当时有索引的话过滤用不了.
    filter需要什么设置吗?
    给你分,谢谢你