如何删除伪重复?

时间:2010-10-27 12:40:28

标签: sql oracle

一些背景知识:我有一个没有约束的临时表来获取给定日期的数据,然后是一些后续代码将这些数据合并到一个带有密钥的表中。我可以使用这个方便的代码轻松摆脱完美的重复:

delete from tbstage where rowid in (
     select rowid from tbstage
   minus
     select min(rowid) from tbstage group by pkeyCol1, pkeyCol2, otherCols
);

这非常适合摆脱同一天出现的完美重复,否则会因为尝试插入一组不稳定的行而导致合并陷入困境。然而,还有一个案例,我越来越常见,无法弄清楚如何处理。有时,会有2个相似的行,除了一些其他的col将为null。我不知道如何以系统的方式摆脱这些行而不会意外删除其他重要数据。这就是问题数据的样子:

      pkeyCol1, pkeyCol2, otherCol1, otherCol2
row1: 123,      ABC,      (null),    hello 
row2: 123,      ABC,      important, hello

在这种情况下,我想摆脱row1并保留row2。是什么让这有点棘手的是,otherCol1可能合法地为null,而otherCol2也是如此。如果row1只有空值,而row2有相同字段的值,那么我想摆脱row1。

非常感谢 - 这已经让我疯狂了好几天了!

1 个答案:

答案 0 :(得分:2)

我这样...... 具有空值的记录将在组中的最后(第二个)。 或者,如果您有两个以上的重复行,则可以使用rn> 1。


SELECT ROWID FROM(
select t.*
      ,rowid
      ,row_number() over(PARTITION BY pkeycol1, pkeycol2 
                             ORDER BY othercol1,othercol2) rn
  from tbstage t)
  WHERE rn=2