当前位置: 首页 > 面试题库 >

从表中删除没有唯一键的重复行

尉迟墨竹
2023-03-14
问题内容

如何删除Postgres 9表中的重复行,行在每个字段上都是完全重复的,并且没有单个字段可用作唯一键,所以我不能只GROUP BY使用列并使用NOTIN语句。

我正在寻找一个SQL语句,而不是需要我创建临时表并将记录插入其中的解决方案。我知道该怎么做,但是需要更多工作来适应我的自动化流程。

表定义:

jthinksearch=> \d releases_labels;
Unlogged table "discogs.releases_labels"
   Column   |  Type   | Modifiers
------------+---------+-----------
 label      | text    |
 release_id | integer |
 catno      | text    |
Indexes:
    "releases_labels_catno_idx" btree (catno)
    "releases_labels_name_idx" btree (label)
Foreign-key constraints:
    "foreign_did" FOREIGN KEY (release_id) REFERENCES release(id)

样本数据:

jthinksearch=> select * from releases_labels  where release_id=6155;
    label     | release_id |   catno
--------------+------------+------------
 Warp Records |       6155 | WAP 39 CDR
 Warp Records |       6155 | WAP 39 CDR

问题答案:

如果您有能力重写整个表,则这可能是最简单的方法:

WITH Deleted AS (
  DELETE FROM discogs.releases_labels
  RETURNING *
)
INSERT INTO discogs.releases_labels
SELECT DISTINCT * FROM Deleted

如果您需要专门针对重复的记录,则可以使用内部ctid字段,该字段唯一地标识一行:

DELETE FROM discogs.releases_labels
WHERE ctid NOT IN (
  SELECT MIN(ctid)
  FROM discogs.releases_labels
  GROUP BY label, release_id, catno
)

要非常小心ctid; 它会随着时间而变化。但是您可以依靠它在单个语句的范围内保持不变。



 类似资料:
  • 问题内容: 我在表中有一些数据,看起来大致如下: tickId和timestamp都不是唯一的,但是tickId和timestamp的组合应该是唯一的。 我的表中有一些重复的数据,并且我试图将其删除。但是,我得出的结论是,给定数据的信息不足,无法区分另一行,基本上没有办法删除重复的行之一。我的猜测是,我将需要引入某种身份列,这将有助于我从另一行中识别出一行。 这是正确的吗,还是有某种神奇的方法可以

  • 问题内容: 我的数据库中有一个表,其中有要删除的重复记录。我不想为此创建具有不同条目的新表。我想要的是从现有表中删除重复的条目,而无需创建任何新表。有什么办法吗? 看到这些都是我的字段: id对于每一行都是唯一的。 L11_data对于相应的动作字段是唯一的。 L11_data具有公司名称,而动作具有行业名称。 因此,在我的数据中,我在L11_data中有各自行业的重复公司名称。 我要拥有的是存储

  • 问题内容: 我在PostgreSQL 8.3.8数据库中有一个表,该表上没有键/约束,并且有多个行,它们的值完全相同。 我想删除所有重复项,并且每行仅保留1个副本。 特别是有一列(称为“密钥”)可用于标识重复项,即,每个不同的“密钥”应该只存在一个条目。 我怎样才能做到这一点?(理想情况下,使用单个SQL命令。) 在这种情况下,速度不是问题(只有几行)。 问题答案:

  • 问题内容: 数据库类型为PostGres 8.3。 如果我写了: 我有一些计数超过1的行。如何取出重复的行(我仍然希望每个行都保留1行,而不是+1行…我不想删除所有行。) 例子: 应该变成: 我找到的唯一答案是 在那里,但是我想知道是否可以在没有哈希列的情况下做到这一点。 警告 我没有具有唯一编号的PK,因此无法使用min(…)技术。PK是3个字段。 问题答案: 这是所有表都应具有主键的众多原因之

  • 问题内容: 如何使用phpMyAdmin在MySQL表的列上删除“唯一键约束”? 问题答案: 唯一约束也是索引。 首先使用来查找索引的名称。索引的名称存储在该查询结果中调用的列中。 然后,您可以使用DROP INDEX: 或ALTER TABLE语法:

  • 我是一个初学者与R.我有一个tibbledata.frame:这是一个基因列表,包含企业ID、基因符号、基因描述和ENSG_ID。我想删除与唯一的ENSG ID相关的基因重复。例如,在我的数据框中发现AKRC1是重复的,有2个ENSG标识,其中一个与基因AKRC2相同。 初始文件 我试图删除重复的,但问题是我保留了AKRC1 #确定非重复基因的指数