使用外键和日期连接表

时间:2018-02-08 07:33:18

标签: sql oracle join

我们有两个表用于两个名为P和M的接受分支。

enter image description here

我在上图中添加了样本数据。

目前我的目标是将两个表与正确的数据同步。

表P被认为具有正确的数据。

  1. 正如您所见,表P中的记录ID=1000与表格M ID=500匹配。
  2. 表P中的记录ID=1001与表格M ID=501匹配,但表格M的日期似乎错误。
  3. 表M中不存在表P中的记录ID=1002
  4. 我想要实现的是获得表P中与表M不匹配的记录以及存在于P而不是M中的记录。

    为实现此目的,我进行了以下查询,该查询将加入REGISTRATION_NOCOMMERCIAL_NOSEL_DATETER_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
    

    以上查询的结果。 The Result For Above Query.

    现在,此结果包含与表M不匹配的记录以及表M中不包含的记录。

    预期输出 1.在表M中获得M。ID未命中匹配记录。 2.获取表M中不存在的P. *记录

    enter image description here

    请帮我改进此查询。满足要求..

    感谢。

    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');
    

1 个答案:

答案 0 :(得分:1)

  

"我的目标是将两个表与正确的数据同步。"

我认为你可以用MERGE做到这一点。

假设:某些列必须可靠。如果公共密钥不是ID(显然不是),则必须有一些内容可以加入M.ID = 501P.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
/