我正在使用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处理这个?
答案 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