Postgresql 删除与其他表匹配的重复行
我有两张桌子Postgresql 删除与其他表匹配的重复行,postgresql,Postgresql,我有两张桌子 Table A Table B -------- --------- a b c a b c a b c a b c a b c a b c e f g a b c
Table A Table B
-------- ---------
a b c a b c
a b c a b c
a b c a b c
e f g a b c
h i j e f g
k l m k l m
k l m
x y z
s t u
a b c
a b c
现在我想删除表B中与表A第1、2和3列相匹配的行,其中表B中每个重复行的计数应小于或等于表A
所以输出应该是
Table A Table B
-------- ---------
a b c a b c
a b c a b c
a b c a b c
e f g e f g
h i j k l m
k l m x y z
s t u
我曾尝试使用内部联接和相交,但未能获得所需的结果 我认为,如果table不是很大,那么简单的方法就是从table B中删除table A中存在的所有行,然后将table A插入table B中。另一种方法是在表B中至少需要一个主键
DELETE FROM TableB
WHERE EXISTS(SELECT * FROM TableA
WHERE C1=TableA.C1
AND C2=TableA.C2
AND C3=TableA.C3) ;
INSERT INTO TableB SELECT * FROM TableA;
尝试:
演示:您能粘贴表格的结构吗?这将更容易帮助您,您可以使用sqlfiddle.com他/她希望保留表B中的副本,只要它们存在于表B中tableA@Leo但是如果行是重复的,并且没有主键,您如何决定应该删除哪一行?他/她不想从表中删除重复的行,他/她想从一个表中删除另一个表中不存在的行,而且还有一种奇怪的计数方式我很抱歉,你是对的。你能在你的答案中做一些最小的修改吗?我能删除否决票吗?
DELETE FROM tableB
WHERE ctid IN (
SELECT BB.ctid
FROM (
SELECT a, b, c, count(*) cnt
FROM tablea
GROUP BY a, b, c
) AA
JOIN (
SELECT ctid,
a, b, c,
row_number() over (partition by a,b,c) cnt
FROM tableb
) BB
ON AA.a = BB.a
AND AA.b = BB.b
AND AA.c = BB.c
AND AA.cnt < BB.cnt
)