Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 删除与其他表匹配的重复行_Postgresql - Fatal编程技术网

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
)