Postgres:删除具有双向关系的重复行

时间:2016-02-06 22:38:25

标签: sql postgresql

我正在使用Postgres数据库,该数据库具有双向连接表。正在清理数据,我们不再需要重复数据。

该表有3.4米的行,但快照是这样的:

import com.google.gson.annotations.SerializedName;

此查询标识对:

sentence_id  |  translation_id
-------------|----------------
77           |  1276
1276         |  77
77           |  2481
2481         |  77
77           |  380381
380381       |  77

我想要做的是删除其中一个重复对,例如,使用第1行和第2行(77,1276和1276,77),我只想保留一行。哪件事并不重要。

示例输出将是:

select s.sentence_id, x.sentence_id
from tmp s, tmp x
where s.sentence_id = x.translation_id
and x.sentence_id = s.translation_id

如何只在Postgres上用SQL处理这个?

2 个答案:

答案 0 :(得分:2)

以下是一种方法:如果sentence_id大于translation_id 并且存在反向关系,则删除一行:

delete from tmp
    where tmp.translation_id > tmp.sentence_id and
          exists (select 1
                  from tmp tmp2
                  where tmp2.sentence_id = tmp.translation_id and
                        tmp.sentence_id = tmp2.translation_id
                 );

话虽如此,从相对较大的表中删除大量行可能效率低下。将值存储在临时表中,截断第一个表并重新插入值可能更好:

create table tmp_tmp as
    select sentence_id, translation_id
    from tmp
    where tmp.translation_id > tmp.sentence_id and
          exists (select 1
                  from tmp tmp2
                  where tmp2.sentence_id = tmp.translation_id and
                        tmp.sentence_id = tmp2.translation_id
                 );

truncate table tmp;

insert into tmp(sentence_id, translation_id)
    select sentence_id, translation_id
    from tmp_tmp;

答案 1 :(得分:1)

您可以使用内部列System.out.println ( "input: " + input + " | zdt: " + zdt + " | instant of zdt: " + zdt.toInstant () );

ctid