【问题标题】:MERGING DATA OF TWO TABLES合并两个表的数据
【发布时间】:2014-03-28 16:58:44
【问题描述】:

我想编写一个查询来查找两个表之间的差异并将更新或新数据写入第三个表。我的两个表具有相同的列名。捕获更改的第三个表有额外的列,称为注释。我想根据行修改插入注释,无论是新行还是更新行。

**TABLE1 (BACKUP)**
KEY,FIRST_NAME,LAST_NAME,CITY
1,RAM,KUMAR,INDIA
2,TOM,MOODY,ENGLAND
3,MOHAMMAD,HAFEEZ,PAKISTAN
4,MONIKA,SAM,USA
5,MIKE,PALEDINO,USA

**TABLE2 (CURRENT)**
KEY,FIRST_NAME,LAST_NAME,CITY
1,RAM,KUMAR,USA
2,TOM,MOODY,ENGLAND
3,MOHAMMAD,HAFEEZ,PAKISTAN
4,MONIKA,SAM,INDIA
5,MIKE,PALEDINO,USA
6,MAHELA,JAYA,SL



**TABLE3 (DIFFERENCE FROM TABLE2 TO TABLE1)**
KEY,FIRST_NAME,LAST_NAME,CITY,COMMENT
1,RAM,KUMAR,USA,UPDATE
4,MONIKA,SAM,INDIA,UPDATE
6,MAHELA,JAYA,SL,INSERT

表格脚本

DROP TABLE TABLE1;
DROP TABLE TABLE2;
DROP TABLE TABLE3;


CREATE TABLE TABLE1
(
KEY NUMBER,
FIRST_NAME VARCHAR2(100),
LAST_NAME VARCHAR2(100),
CITY VARCHAR2(50)
);
/


CREATE TABLE TABLE2
(
KEY NUMBER,
FIRST_NAME VARCHAR2(100),
LAST_NAME VARCHAR2(100),
CITY VARCHAR2(50)
);
/


CREATE TABLE TABLE3
(
KEY NUMBER,
FIRST_NAME VARCHAR2(100),
LAST_NAME VARCHAR2(100),
CITY VARCHAR2(50),
COMMENTS VARCHAR2(200)
);
/

INSERT ALL 
INTO TABLE1
VALUES(1,'RAM','KUMAR','INDIA')
INTO TABLE1 VALUES(2,'TOM','MOODY','ENGLAND')
INTO TABLE1 VALUES(3,'MOHAMMAD','HAFEEZ','PAKISTAN')
INTO TABLE1 VALUES(4,'MONIKA','SAM','USA')
INTO TABLE1 VALUES(5,'MIKE','PALEDINO','USA')
SELECT 1 FROM DUAL;

/

INSERT ALL 
INTO TABLE2
VALUES(1,'RAM','KUMAR','USA')
INTO TABLE2 VALUES(2,'TOM','MOODY','ENGLAND')
INTO TABLE2 VALUES(3,'MOHAMMAD','HAFEEZ','PAKISTAN')
INTO TABLE2 VALUES(4,'MONIKA','SAM','INDIA')
INTO TABLE2 VALUES(5,'MIKE','PALEDINO','USA')
INTO TABLE2 VALUES(6,'MAHELA','JAYA','SL')

SELECT 1 FROM DUAL;

我正在使用合并语句来完成相同的操作。但我在合并语句中遇到了障碍,它抛出一个错误“SQL错误:ORA-00905:缺少关键字 00905. 00000 - “缺少关键字”“我不明白错误在哪里。请帮助

INSERT INTO TABLE3
SELECT KEY,FIRST_NAME,LAST_NAME,CITY,NULL AS COMMENTS FROM TABLE2
MINUS 
SELECT KEY,FIRST_NAME,LAST_NAME,CITY,NULL AS COMMENTS FROM TABLE1

;


MERGE INTO TABLE3 A
USING TABLE1 B
ON (A.KEY=B.KEY)
WHEN MATCHED THEN 
UPDATE SET A.COMMENTS='UPDATED'
WHEN NOT MATCHED THEN
UPDATE SET A.COMMENTS='INSERTED';

【问题讨论】:

标签: oracle plsql oracle11g


【解决方案1】:

没有这样的WHEN NOT MATCHED THEN UPDATE 子句,你应该使用WHEN NOT MATCHED THEN INSERT。详情请参考MERGE

【讨论】:

    【解决方案2】:

    对数据的一些假设:

    • INSERT 事件将是由其在 table2(当前数据)中的键标识的记录,该记录在原始备份表中没有匹配键:table1
    • UPDATE 事件是存在于同一 KEYtable1table2 中但不相同的字段。
    • 表之间没有变化的记录不会记录在table3中。

    示例查询:检查更新

     SELECT UPD_QUERY.NEW_CITY, 'UPDATED' as COMMENTS
       FROM (SELECT CASE WHEN REPLACE(CURR.CITY, BKUP.CITY,'') IS NOT NULL THEN CURR.CITY
                    ELSE NULL END as NEW_CITY
               FROM table1 BKUP,  table2  CURR
              WHERE BKUP.KEY = CURR.KEY) UPD_QUERY
      WHERE UPD_QUERY.NEW_CITY is NOT NULL;
    

    您可以对其他字段重复此比较方法:

          SELECT UPD_QUERY.*
            FROM (SELECT CURR.KEY, 
                    CASE WHEN REPLACE(CURR.FIRST_NAME, BKUP.FIRST_NAME,'') IS NOT NULL
                         THEN CURR.FIRST_NAME
                         ELSE NULL END as FIRST_NAME,
    
                    CASE WHEN REPLACE(CURR.LAST_NAME, BKUP.LAST_NAME,'') IS NOT NULL
                         THEN CURR.LAST_NAME
                         ELSE NULL END as LAST_NAME,
    
                    CASE WHEN REPLACE(CURR.CITY, BKUP.CITY,'') IS NOT NULL 
                         THEN CURR.CITY
                         ELSE NULL END as CITY
               
                    FROM table1 BKUP, table2 CURR
                   WHERE BKUP.KEY = CURR.KEY) UPD_QUERY
         WHERE COALESCE(UPD_QUERY.FIRST_NAME, UPD_QUERY.LAST_NAME, UPD_QUERY.CITY) 
               is NOT NULL;
    

    注意:如果比较的列数很多,这可能会很快变得笨拙。由于目标表设计 (table3) 不仅需要识别更改,还需要记录字段及其新值。


    示例查询:查找新添加的记录

     SELECT CURR.*, 'INSERTED' as COMMENTS
       FROM table2 CURR, table1 BKUP
      WHERE CURR.KEY = BKUP.KEY(+)
        AND BKUP.KEY is NULL;
    

    【讨论】:

      【解决方案3】:

      基本上 MERGE 强制执行操作:MATCHED=UPDATE(或 DELETE),NOT MATCHED = INSERT。它在the docs

      你可以做你想做的,但你需要两个带有不同集合运算符的插入语句,

      对于更新:

      Insert into table3 
          table1 INTERSECT table2
      

      对于插入:

      Insert into table3 
          table2 MINUS table1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 2020-10-16
        • 2014-04-10
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        相关资源
        最近更新 更多