我有一个没有主键的表,其中OBJID列上有超过13,000条记录是重复的,但其他列中的值不同。我想把两个重复的记录合并成一个。有没有可能用merge语句来完成这一点,或者我需要用循环更新表并手动修复它?
下面是该表的外观:
OBJID,INVKLASSE,NETTYPE,NAVN,ALT_NAVN,ON_ID,ON_TYPE,ON_STED_NR,ON_OVER_ID-219468,NYINVESTERING,,,,,,,,,,,,,-219468,,,,,,,,,,,,,277615,50,277614,-99-218981,NYINVESTERING,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-218761,,,,,,,277909,50,277908,-99-218709,NYINVESTERING,,,,,,,,,,,,,,,,,,,218709,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
我已经创建了一个临时表,我试图插入所有重复的记录,其中OBJID是主键。
select * from (
select
objid,INVKLASSE,NETTTYPE,NAVN,ALT_NAVN,ON_ID,ON_TYPE,ON_STED_NR,ON_OVER_ID,
row_number() over(partition by objid order by objid) as DUP
from USEROPENNIS
)
where dup=2;
我已经创建了一些类似这样的SQL来分隔DUP = 1或2的所有重复记录。所有DUP = 1都可以作为唯一记录插入,但是DUP = 2是13,000条记录,我需要更新所有列都为null或类似的表。
我正在寻找任何可以快速修复它的建议。
预期输出。
2条答案
按热度按时间ne5o7dgx1#
要将重复的记录折叠成一个,同时从每个记录中选择列值,您需要在主键上使用
GROUP BY
,并在所有非键列周围使用聚合函数(如MAX
),每个聚合中可能有DECODE
/CASE
,它们试图决定优先考虑哪些值。如果您唯一的问题是某些行的所有列都有
NULL
,而其他行有数据,那么请删除具有NULL
值的行。或者,如果它是混合的,但仍然只有NULL
与非NULL
问题,MAX
本身将挑选出非NULL
值。如果比这更复杂,并且有多个非NULL
值可供选择,则必须编写逻辑来选择所需的值。简单来说:
更复杂(这可以看起来像任何东西,这只是给出了大致的想法):
一旦你在
SELECT
查询中获得了你想要的数据,你就可以把你想出来的查询放在CTAS中来创建一个临时表:现在截断原始表,并将临时表的内容插入其中:
现在在上面创建一个PK,这样你就不会再次陷入这种情况:
jutyujz02#
创建一个新表,如下所示
| OBJID| INVKLASSE|
| - -----|- -----|
| 十二岁|一个|
| 十四|B|
fiddle
然后删除旧表
然后呢