【问题标题】:Remove duplicates based on two fields根据两个字段删除重复项
【发布时间】:2014-10-29 20:09:42
【问题描述】:

我有一个包含 14 列的表,可以称为 column_1 - column_14。我需要一个在两个字段(即 column_1 和 column_2)的组合上唯一的表。我在这个表中不能有任何实例,其中在 column_1 和 2 中有多行包含相同的信息。为了清楚地理解我的意思,我引用了这篇文章来识别我所说的重复项。

我已经引用了this post

现在,我需要学习如何从我的表中删除这些行,所以我留下了基于第 1 列和第 2 列的完全唯一的行。

谢谢

【问题讨论】:

  • 你需要一个group by 子句。

标签: sql oracle


【解决方案1】:

为了找到您的重复项,您可以使用以下查询

SELECT * FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2); //those are the columns that define which row is unique

为了删除重复项

  DELETE FROM your_table
 WHERE rowid not in
 (SELECT MIN(rowid)
 FROM your_table
 GROUP BY column1, column2); //those are the columns that define  row is unique

【讨论】:

  • id 用什么代替? Oracle 告诉我,标识符无效。
  • 你的表的主键或每行的唯一标识符
  • 没有唯一标识符。 Column_1 是我拥有的最独特的标识符,因此出现重复的问题
  • 然后使用 rowid 代替 id。检查 Gordon Linoff 的答案
【解决方案2】:

Oracle 有一个rowid 伪列,可以完全用于此目的。这意味着即使您的数据没有唯一的 id,您也可以做您想做的事(这在 Oracle 数据库中很常见,因为在 Oracle 12 之前设置自动递增的主键很痛苦)。

代码如下:

DELETE FROM table t
    WHERE rowid > (SELECT min(rowid) FROM table t2 WHERE t2.col1 = t.col1 and t2.col2 = t.col2);

注意min(rowid) 是一个任意 行。不一定是插入两个值的第一行。

【讨论】:

  • 没有表被引用为只是 t... 只有一个 t2。因此这不适合我
  • @DillonTagle 。 . .我错误地在from 语句中留下了列别名。
【解决方案3】:
WITH Temp (column_1, column_2, duplicateRecCount)
AS
(
SELECT column_1, column_2, ROW_NUMBER() OVER(PARTITION by column_1, column_2 ORDER BY column_1, column_2) 
AS duplicateRecCount
FROM Your_Table
)
--Now Delete Duplicate Records
DELETE FROM Temp
WHERE duplicateRecCount > 1

【讨论】:

  • 我也是这么想的,但它在 Oracle 中无效。此外,如果您突出显示所有代码并点击{} 按钮,它会将其格式化为代码。
猜你喜欢
  • 2021-02-09
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2023-03-10
  • 2016-11-04
相关资源
最近更新 更多