使用pl-sql将记录从一个表复制到另一个表

时间:2014-08-06 13:41:59

标签: oracle plsql

我想将记录从一个表复制到另一个表。 表1中将复制到表2的唯一记录是表2中仍然不存在的记录。 如果表1中存在重复记录,则只能将名称较大的记录复制到表2中。

我已经可以实现几乎完成我想要的查询。 我遇到的问题是当名称具有相同的最大字符大小时。 在这些情况下,我的查询返回多个记录,我只想在表2中插入一个新记录。

有谁知道如何解决这个问题?

这是我的代码:

For x in (Select distinct xdd.id_t, xdd.name_t
           From table1 xdd
          Where xdd.id_t not in (Select distinct det.id_t2
                                  From table2 det) 
            And LENGTH(xdd.name_t) in (Select Max(LENGTH(xdd2.name_t))
                                        From table1 xdd2
                                       Where xdd2.id_t = xdd.id_t) 
         ) Loop

    Insert into id_t2 (id_t2, name_t2)
       Values (x.id_t, x.name_t);         

End loop;

2 个答案:

答案 0 :(得分:1)

Can you give me an example to solve this? 当然。如果我正确理解了要求,那么merge语句看起来与此类似:

我们使用row_number()分析函数来选择长name_t

的重复记录
merge into table_two t2
  using(
        select id_t
             , name_t
          from (select id_t
                     , name_t   
                     , row_number() over(partition by id_t 
                                             order by length(name_t) desc) as rn
                  from table_one) q
                 where q.rn = 1
         ) t1
     on (t2.id_t = t1.id_t)
when not matched then
   insert(id_t, name_t) 
     values(t1.id_t, t1.name_t)

SQLFiddle demo

答案 1 :(得分:0)

这是一个合并语句,应该将表1中的数据“upsert”到表2中。只有当table1中的name字段大于表2的名称字段时,匹配键才会更新。当表1中的键是与表2不符。

MERGE INTO table2 D
   USING (SELECT table1.id_t, table1.name_t FROM table1) S
   ON (D.id_t2 = S.id_t)
   WHEN MATCHED THEN UPDATE SET D.name_t2 = S.name_t
     WHERE (LENGTH(S.name_t) > LENGTH(D.name_t2))
   WHEN NOT MATCHED THEN INSERT (D.id_t, D.name_t)
     VALUES (S.id_t2, S.name_t2);