我们有两个表用于两个名为P和M的接受分支。
我在上图中添加了样本数据。
目前我的目标是将两个表与正确的数据同步。
表P被认为具有正确的数据。
ID=1000
与表格M ID=500
匹配。ID=1001
与表格M ID=501
匹配,但表格M的日期似乎错误。ID=1002
。我想要实现的是获得表P中与表M不匹配的记录以及存在于P而不是M中的记录。
为实现此目的,我进行了以下查询,该查询将加入REGISTRATION_NO
,COMMERCIAL_NO
,SEL_DATE
和TER_DATE
SELECT P.*
FROM P LEFT JOIN M ON
P.REGISTRATION_NO = M.REGISTRATION_NO
AND
P.COMMERCIAL_NO = M.COMMERCIAL_NO
AND
P.SEL_DATE = M.SEL_DATE AND P.TER_DATE = M.TER_DATE
WHERE
M.REGISTRATION_NO IS NULL
现在,此结果包含与表M不匹配的记录以及表M中不包含的记录。
预期输出
1.在表M中获得M。ID
未命中匹配记录。
2.获取表M中不存在的P. *记录
请帮我改进此查询。满足要求..
感谢。
CREATE TABLE P (ID NUMBER,REGISTRATION_NO NUMBER,COMMERCIAL_NO NUMBER,SEL_DATE DATE,TER_DATE DATE);
CREATE TABLE M (ID NUMBER,REGISTRATION_NO NUMBER,COMMERCIAL_NO NUMBER,SEL_DATE DATE,TER_DATE DATE);
TRUNCATE TABLE P;
TRUNCATE TABLE M;
SELECT * FROM P;
SELECT * FROM M;
INSERT INTO HUDHAIFA.P
(ID,REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
VALUES(1000,1, 100, '1-JAN-2012', '31-DEC-2012');
INSERT INTO HUDHAIFA.M
(ID,REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
VALUES(500,1, 100, '1-JAN-2012', '31-DEC-2012');
-----------------------------------------------------
INSERT INTO HUDHAIFA.P
(ID,REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
VALUES(1001,1, 200, '1-JAN-2013', '31-DEC-2013');
INSERT INTO HUDHAIFA.M
(ID,REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
VALUES(501,1, 200, '5-JAN-2013', '31-DEC-2013');
-----------------------------------------------------
INSERT INTO HUDHAIFA.P
(ID,REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
VALUES(1002,1, 100, '1-JAN-2014', '31-DEC-2014');
答案 0 :(得分:1)
"我的目标是将两个表与正确的数据同步。"
我认为你可以用MERGE做到这一点。
假设:某些列必须可靠。如果公共密钥不是ID
(显然不是),则必须有一些内容可以加入M.ID = 501
到P.ID = 1001
。所以我猜测它是(REGISTRATION_NO, COMMERCIAL_NO)
。
它不能是(REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
,因为SEL_DATE
的值在给定示例中是不同的。
请注意,如果
merge into M
using ( select * from P ) p
on (p.REGISTRATION_NO = M.REGISTRATION_NO
and P.COMMERCIAL_NO = M.COMMERCIAL_NO)
when not matched then
insert (ID, REGISTRATION_NO, COMMERCIAL_NO, SEL_DATE, TER_DATE)
values (P.ID, P.REGISTRATION_NO, P.COMMERCIAL_NO, P.SEL_DATE, P.TER_DATE)
when matched then
update
set M.ID = P.ID
, M.SEL_DATE = P.SEL_DATE
, M.TER_DATE = P.TER_DATE
/