【问题标题】:How to keep only the first unique element and delete its duplicates in oracle?如何仅保留第一个唯一元素并在 oracle 中删除其重复项?
【发布时间】:2020-03-28 18:22:59
【问题描述】:

所以这个查询语句看起来很简单,但实际上并不那么容易。 这是我尝试过的代码。

Delete from table where id
In (select id from (select 
 id, row_number() 
  over(partition by id) 
rn from table where rn>1)

上述方法可以工作,但对于几乎所有数据库来说,这不是标准的 sql,例如 partition by 在大多数其他数据库中可能不受支持。我在下面尝试的是可以使用 group by。我在下面尝试过,但我不确定这是否可行。任何建议以及优化哪一个

  //using group by    
Delete from table where id
In (select id from(select 
 id from table 
  Group by id 
  Having sum(1)>1) 

  )

【问题讨论】:

标签: sql oracle


【解决方案1】:

正如问题所说

在 oracle 中删除其重复项

然后

delete from your_table a
where a.rowid > (select min(b.rowid)
                 from your_table b
                 where b.id = a.id
                );

【讨论】:

  • 感谢这也有助于关联子查询始终保持高效,但只是想知道 rowid 是否适用于所有版本
  • 不客气。它适用于所有版本的 Oracle。我不知道其他 DBMS,所以我不知道他们是否有 ROWID。
  • 我假设几乎所有 RDBMS 都有某种 ROWID,但是名称可能不同。例如,SQLite 使用ROWID,但它是一个整数。 MongoDB使用_id
  • 是的,我想要更通用的东西,所以同样问。谢谢..
【解决方案2】:

你可以使用exists如下:

Delete from your_table t
Where exists (select 1 from your_table t1
Where t1.id = t.id
And t1.rowid > t.rowid)

【讨论】:

  • 感谢提醒,我知道存在比 In 更好用。但是 rowid 是否适用于所有版本
  • @HimanshuAhuja,你为什么关心 ROWID?即使 ROWID 格式会随着每个 Oracle 版本而改变,它仍然可以工作。
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2012-04-12
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多