先有A、B、C、D、E共5张表
表结构均相同 都为5列 
列名分别是:id, user_id, pos_id, cdate, price
A、B为原始数据表 C、D、E为空表现要求 对比A、B中的数据。当(A.user_id = B.user_id and A.pos_id = B.pos_id and A.cdate = B.cdate)时
认为是同一条记录 并将该记录写入到C表中
若A中存在B中没有的记录,将该记录写入到D表中
反之,若B中存在A中没有的记录,将其写入到E表中往各位兄弟能提供一个可读性和性能较高的实现方法或思路,谢谢!

解决方案 »

  1.   

    insert into c select a.* from a,b 
    where a.user_id = B.user_id and A.pos_id = B.pos_id and A.cdate = B.cdate;insert into d select a.* from a minus select b.* from b;insert into e select b.* from b minus select a.* from a;
      

  2.   

    用INSERT ALL,此命令可以根据不同的条件写入多表,而且只用一句话可实现,非常高效,具体写法请查看Oracle文档。下面是一个例子:
    INSERT ALL
       WHEN ottl < 100000 THEN
          INTO small_orders
             VALUES(oid, ottl, sid, cid)
       WHEN ottl > 100000 and ottl < 200000 THEN
          INTO medium_orders 
             VALUES(oid, ottl, sid, cid)
       WHEN ottl > 200000 THEN
          into large_orders
             VALUES(oid, ottl, sid, cid)
       WHEN ottl > 290000 THEN
          INTO special_orders
       SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,
          o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem
          FROM orders o, customers c
          WHERE o.customer_id = c.customer_id;
      

  3.   

    另外还要用A表和B表做一个FULL OUTER JOIN
      

  4.   

    第二条sql改成
    insert into d select a.* from a minus select c.* from c;
    会好一点。
      

  5.   

    若A中存在B中没有的记录,将该记录写入到D表中 
    反之,若B中存在A中没有的记录,将其写入到E表中 这个存在指的是完全匹配,还是比较(A.user_id = B.user_id and A.pos_id = B.pos_id and A.cdate = B.cdate)还有插入c表的数据,(A.user_id = B.user_id and A.pos_id = B.pos_id and A.cdate = B.cdate)这三个字段相同,那么另外两个字段在a,b表中值可能不同,如果处理。取a的?
      

  6.   

    用交集和差集做,顶,
    还有个方法,取出A,B UNION后的财富记录插入到C,
      

  7.   


    ID自生成 这个不同无所谓 根据我的实际情况其他3个条件相同了price肯定也相同
      

  8.   


    我初学Oracle 关于minus网上查了下资料
    如果我的A、B的主键都是自增 那么很大可能会出现 我需要比较的3个条件相同 但是主键不同的情况
    不知道minus函数是不是要求所有字段完全相同 如果如此 可能无法满足我的要求
      

  9.   

    #9第1,2条sql是可以满足你的要求的,因为第1条并未使用minus至于第2条,因为minus后面做减数的条是c,该表数据本来就来自于表a,所以也不会有问题第3条sql不满足你的要求,需要做适当修改。表b左连接表c,price为null的插入。
      

  10.   

    小弟初学Oracle 另外再问一个小问题
    我后台用的Java 此程序是每天需要定时运行的程序 比如每天的0点统计汇总当天的数据
    那么我是写成普通的SQL运行效率高还是 用PL/SQL写成存储过程运行效率高?
    每天A、B两表的数据大约是1KW级别
      

  11.   

    当然是直接用sql能用sql就尽量不要用procedure
    能用简单语句写出就不用分析函数
    能用oracle本身的功能就不用第三方代码或者工具;所以综上,你可以用dbms_job调sql来做,完全不用java。
      

  12.   

    给个例子参考
    SQL> create table a(a date);Table createdSQL> variable job1 number;
    SQL> begin
      2  dbms_job.submit(:job1,'insert into a values(sysdate);',sysdate,'sysdate + 1/1440');
      3  end;
      4  /PL/SQL procedure successfully completed
    job1
    ---------
    21SQL> begin
      2  dbms_job.run(:job1);
      3  end;
      4  /PL/SQL procedure successfully completedSQL> select to_char(a,'mm/dd/yyyy hh24:mi:ss') from a;TO_CHAR(A,'MM/DD/YYYYHH24:MI:SS'
    ------------------------------
    12/01/2009 14:03:54
    12/01/2009 14:04:59SQL> begin
      2  dbms_job.remove(:job1); -- 移除job
      3  end;
      4  /PL/SQL procedure successfully completed