有A,B,C 三个表,完成如下功能:
1,  查询 A 表有的数据,而B表没有的数据。(A表和B表的差异数据)
2,   把上面查询出的结果插入C 表,并且更新 A表的字段 A_1(更新方式:A_1 + 1 =A_1)。

解决方案 »

  1.   

    SQL> select * from a;        ID        A_1
    ---------- ----------
             1         10
             2         30
             3         30SQL> select * from b;        ID
    ----------
             1SQL> select * from c;no rows selectedSQL> insert into c (id) select a.id from a,b where a.id=b.id(+) and b.id is null;2 rows created.SQL> commit;Commit complete.SQL> select * from c;        ID
    ----------
             2
             3如果数据量不大,可以这样更新
    SQL> update a set a_1=a_1+1 where rowid in(select a.rowid from a,b where a.id=b.id(+) and b.id is null);2 rows updated.SQL> commit;Commit complete.SQL> select * from a;        ID        A_1
    ---------- ----------
             1         10
             2         31
             3         31
      

  2.   

    insert c
    select * from t1
    minus 
    select * from t2;update t1  X
    set t1.A_1=T1.A_1+1
    WHERE EXISTS 
    (SELECT 1 FROM (SELECT * FROM T1  MINUS SELECT * FROM T2 ) Y
    WHERE X.A_1=Y.A_1
    )
    呵呵,没测试过,你试试看应该没错的.
      

  3.   

    很感谢ATGC和学习奋斗的答复,

    1, select a.id from a,b where a.id=b.id(+) and b.id is null 会把a表和b表相同的数据,也查询出来,我要的是a表和b表的差异数据,也就是a表中有的数据,而b表中没有。
    2, a表和b表,我统计了一下,分别都是具有百万数据的表。
    3, 学习奋斗的SQL运行不了哦。
      

  4.   

    1.select a.id from a,b where a.id=b.id(+) and b.id is null 
      肯定只查出A表有的,而B表没的记录,而不是像你说都的“会把a表和b表相同的数据,也查询出来”
      

  5.   

    你不知道这个(+)的作用,也没有仔细看我给你的SQL的执行过程
      

  6.   

    (+):是左右外连接的意思,(+)放在等号的右边,代表是左外连接,以等号左边的表数据为主,(包含a表和b表相同的数据)。
    你可以把b表里,填充些数据,你再试试。
      

  7.   

    不错,是包含了A表和B表相同的数据,但是也列出了A表有而B表没有的数据对吧?
    当A表有的数据,而B表没有时,那么显示的是NULL值,因此,只要加一个条件,B.ID IS NULL就能选出A表有,而B表没有的数据了
    我说你没有仔细看我贴出来的SQL.
    这个你无需怀疑,概念非常清楚的SQL> select * from a;        ID
    ----------
             1
             2
             3Elapsed: 00:00:00.00
    SQL> select * from b;        ID
    ----------
             1Elapsed: 00:00:00.00
    SQL> select a.id,b.id from a,b where a.id=b.id(+);        ID         ID
    ---------- ----------
             1          1
             2
             3Elapsed: 00:00:00.00
    SQL> select a.id,b.id from a,b where a.id=b.id(+) and b.id is null;        ID         ID
    ---------- ----------
             2
             3Elapsed: 00:00:00.00
    SQL>
      

  8.   

    1,select a.id,b.id from a,b where a.id=b.id(+) and b.id is null;
    2,select a.id from a where a.id not in (select b.id from b);
    我在PL/SQL里使用执行计划,显示耗费都是一样(id都有索引),因为a表和b表都是有百万数据的表,请问有优化的方法吗?
      

  9.   

    一句SQL的执行,只要资源消耗是可以接受的,执行时间是可以接受的,就行了
    所谓 "优化" 是相对的
    没有绝对的好,也没有绝对的不好
    同样的SQL,由于环境,数据量等的变化,本来执行得好好的SQL也会很慢
      

  10.   

    呵呵,今天让我受益非浅,谢谢你ATGC。
      

  11.   

    查询两表数据匹配问题用外连接的效率一般要好过使用not in,尤其在数据量很大的情况下~~~
      

  12.   

    select a.*  into c.* from a where a.connect_id not in (select b.connect.id from b );
    update a
    set A_1=A_1+1
    where 条件;
    觉得可能要对表c有限制的,应该和表a的结构相同才可以的。