先有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表中往各位兄弟能提供一个可读性和性能较高的实现方法或思路,谢谢!
表结构均相同 都为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表中往各位兄弟能提供一个可读性和性能较高的实现方法或思路,谢谢!
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;
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;
insert into d select a.* from a minus select c.* from c;
会好一点。
反之,若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的?
还有个方法,取出A,B UNION后的财富记录插入到C,
ID自生成 这个不同无所谓 根据我的实际情况其他3个条件相同了price肯定也相同
我初学Oracle 关于minus网上查了下资料
如果我的A、B的主键都是自增 那么很大可能会出现 我需要比较的3个条件相同 但是主键不同的情况
不知道minus函数是不是要求所有字段完全相同 如果如此 可能无法满足我的要求
我后台用的Java 此程序是每天需要定时运行的程序 比如每天的0点统计汇总当天的数据
那么我是写成普通的SQL运行效率高还是 用PL/SQL写成存储过程运行效率高?
每天A、B两表的数据大约是1KW级别
能用简单语句写出就不用分析函数
能用oracle本身的功能就不用第三方代码或者工具;所以综上,你可以用dbms_job调sql来做,完全不用java。
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