Sql 使用外键和日期连接表

Sql 使用外键和日期连接表,sql,oracle,join,Sql,Oracle,Join,我们有两个表,分别代表两个接受分支p和M 我已经在上图中添加了示例数据 目前我的目标是用正确的数据同步两个表 表p被认为具有正确的数据 如您所见,表P中的记录ID=1000与表M ID=500匹配。 表P中的记录ID=1001与表M ID=501匹配,但表M似乎有错误的日期。 表P中的记录ID=1002在表M中不存在。 我试图获得的是表p中与表M不匹配的记录,以及存在于p中而不存在于M中的记录 为了实现这一点,我做了下面的查询,它将与注册号、商业号、选择日期和终止日期连接在一起 以上查询的结果

我们有两个表,分别代表两个接受分支p和M

我已经在上图中添加了示例数据

目前我的目标是用正确的数据同步两个表

表p被认为具有正确的数据

如您所见,表P中的记录ID=1000与表M ID=500匹配。 表P中的记录ID=1001与表M ID=501匹配,但表M似乎有错误的日期。 表P中的记录ID=1002在表M中不存在。 我试图获得的是表p中与表M不匹配的记录,以及存在于p中而不存在于M中的记录

为了实现这一点,我做了下面的查询,它将与注册号、商业号、选择日期和终止日期连接在一起

以上查询的结果。

现在,这个结果包含与表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');
我的目标是用正确的数据同步两个表

我想你可以合并

假设:某些列必须是可靠的。如果公共密钥不是ID,那么肯定有东西可以将M.ID=501连接到P.ID=1001。所以我猜是注册号,商业号

它不能是注册号、商业号、选择日期、终止日期,因为在给定示例中选择日期的值不同

注意,如果

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
/

FK用于实现数据一致性。与select无关。@APC M.ID对于不存在的记录将为空,对于不匹配的记录,我需要M.ID。@APC预期已添加输出图像。@APC注册号、商业号、选择日期、终止日期,我正在与M.REGISTRATION进行左连接。注册号为空,这将带来不匹配和丢失的记录。@APC M.ID=501与P.ID=1001进行连接,P.ID 1002在M tableM.ID中没有匹配的记录,P.ID是相应表的主键,我们不能接受M.ID=P.ID您没有定义同步的含义。我猜了一下。如果这不符合您的要求,请编辑您的问题以解释您实际需要的内容。我需要在M中插入P记录,如果M中不存在P记录,则更新M记录日期,如果它与P不匹配。这就是我的代码所做的。除非你抱怨ID。请准确定义你想要的。说真的,我正在尽我最大的努力来帮助你,但是你真的很难用文字来解释整个场景,很抱歉,我们不能用p.REGISTRATION\u NO=M.REGISTRATION\u NO和p.COMMERCIAL\u NO=M.COMMERCIAL\u NO来加入这两个表,因为可以有重复的p.REGISTRATION\u NO,M.COMMERCIAL\u NO,唯一性由所有4列定义。再次抱歉。如果我不够清楚的话。谢谢你的努力
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
/