我想将记录从一个表复制到另一个表。 表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;
答案 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)
答案 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);