如何解决在Oracle 19
您好,这个查询:( oracle 19 )
CREATE TABLE REGISTRO_LOCAL
( ID NUMBER,USUARIO VARCHAR2(20),FECHA_CARGA TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,fecha date,valor number(19,6),CONSTRAINT REGISTRO_LOCAL_PK PRIMARY KEY (ID) ENABLE
);
CREATE SEQUENCE REGISTRO_LOCAL_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 41 CACHE 20 NOORDER NOCYCLE;
commit;
ALTER TABLE REGISTRO_LOCAL
MODIFY id DEFAULT REGISTRO_LOCAL_SEQ.nextval;
CREATE TABLE REGISTRO_API
( ID NUMBER,CONSTRAINT REGISTRO_API_PK PRIMARY KEY (ID) ENABLE
);
CREATE SEQUENCE REGISTRO_API_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 41 CACHE 20 NOORDER NOCYCLE;
commit;
ALTER TABLE REGISTRO_API
MODIFY id DEFAULT REGISTRO_API_SEQ.nextval;
Insert into REGISTRO_LOCAL (ID,USUARIO,FECHA_CARGA,FECHA,VALOR) values ('41','bird',to_timestamp('20/08/20 09:46:13,416616000','DD/MM/RR HH24:MI:SSXFF'),to_date('22/08/20','DD/MM/RR'),'23,234');
Insert into REGISTRO_LOCAL (ID,VALOR) values ('42','dog',488931000',to_date('21/08/20','5,2341');
Insert into REGISTRO_LOCAL (ID,VALOR) values ('43','horse',to_timestamp('20/08/20 09:46:31,436053000',to_date('23/08/20','5');
Insert into REGISTRO_LOCAL (ID,VALOR) values ('44','cat',to_timestamp('20/08/20 09:48:22,037646000',to_date('20/08/20','67,VALOR) values ('45','zebra',to_timestamp('20/08/20 09:50:04,350761000','23');
Insert into REGISTRO_LOCAL (ID,VALOR) values ('46','spider',to_timestamp('20/08/20 09:50:49,557596000','4');
Insert into REGISTRO_API (ID,VALOR) values ('80',234');
Insert into REGISTRO_API (ID,VALOR) values ('81','8');
Insert into REGISTRO_API (ID,VALOR) values ('82','6,VALOR) values ('83','4');
Insert into REGISTRO_API (ID,VALOR) values ('84','rabbit',618559000','3,867');
并使用此图片:
我想知道是否有一种方法可以识别两个表之间的差异。
具有最后信息的数据将在REGISTRO_API表上。可以轻松删除REGISTRO_LOCAL并从REGISTRO_API中插入日期。
但是我不能做到这一点。
1 -我必须使用REGISTRO_API中的新日期通过REGISTRO_LOCAL进行更新(这可以删除并创建,而不必是UPDATE)
2 -当REGISTRO_API上不存在该记录时,我必须从REGISTRO_LOCAL中删除该记录
3 -我必须插入REGISTRO_API上存在且不在REGISTRO_LOCAL上的记录
那么哪种方法最好呢?
解决方法
如果我了解您的要求,则可以使用“完全外部联接”标识所有行:
select rl.id rl_id,rl.usuario rl_usuario,rl.fecha_carga rl_fecha_carga,rl.fecha rl_fecha,rl.valor rl_valor,ra.id ra_id,ra.usuario ra_usuario,ra.fecha_carga ra_fecha_carga,ra.fecha ra_fecha,ra.valor ra_valor
from registro_local rl
full outer join registro_api ra
on ra.usuario = rl.usuario ;
以此为基础完成更新的过程。为上述查询定义一个游标,它们使用Bulk Collect和Forall在本地表和API表上进行插入。然后,对集合进行迭代,以删除(删除)那些已插入或尚未更新的项目。根据数据量,您可能希望“不更新”检入查询本身。最后,再次使用Forall处理本地更新,有关完整示例,请参见fiddle。然后,您可以根据需要使用作业调度程序(是Oracle内部调度程序还是外部调度程序)来运行该过程。
,我正在通过以下方式解决此问题:
首先-我在两个表之间进行合并 第二-通过本地表进行更新
这是它的样子:
查询:
merge into REGISTRO_LOCAL l
using
(
select USUARIO,FECHA_CARGA,FECHA,VALOR
from REGISTRO_API
) a
on (
1=1
and l.USUARIO = a.USUARIO
and l.FECHA_CARGA = a.FECHA_CARGA
and l.FECHA = a.FECHA
--and l.VAlOR = a.VALOR
)
WHEN MATCHED THEN
update set l.VAlOR = a.VALOR,l.ACTION = 'U'
WHEN NOT MATCHED THEN
insert (
USUARIO,VALOR,ACTION
)values(
a.USUARIO,a.FECHA_CARGA,a.FECHA,a.VALOR,'I'
);
END;
update REGISTRO_LOCAL
set action = 'D'
where action is null;
commit;
我希望对其他人有用...
致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。