删除重复的行,并将其余行追加到另一个表

时间:2019-06-16 12:34:49

标签: sql postgresql

我在PostgreSQL数据库中有两个表,假设rawtotal表。我想做的是创建一个查询,以检查raw表的每一行中的数据是否已经存在于total中。如果是,请删除该行。如果否,则将该行插入total表中。例如

raw

product       brand       Date
--------------------------------------------
pencil          A        2019-06-16 10:00:00
pen             B        2019-06-16 10:00:00
eraser          C        2019-06-16 10:00:00  

total

id         product       brand       Date
--------------------------------------------------------
 1           pencil         A        2019-06-16 10:00:00
 2            pen           B        2019-06-16 10:00:00

基于此,raw中的前两行将被删除。最后一行将插入total 结果:

raw(此表将在以后使用)

product       brand       Date
--------------------------------------------
eraser          C        2019-06-16 10:00:00  

total

product       brand       Date
--------------------------------------------
pencil          A        2019-06-16 10:00:00
pen             B        2019-06-16 10:00:00
eraser          C        2019-06-16 10:00:00  

我能想到的是首先用rawDELETE中的行进行重复数据删除 像这样(不确定此查询的正确性,但我只是想简化我的想法)

DELETE FROM raw r
USING total t
WHERE (r.product = t.product AND . . .) --check all of the columns in raw with columns in total

使raw表仅包含total中不存在的数据,然后使用另一个查询将所有数据插入total中。但是,在单个查询中是否有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

您可以使用:

WITH cte AS (
  DELETE FROM raw
  WHERE EXISTS (SELECT 1 FROM total WHERE raw.product = total.product AND ...)
) 
INSERT INTO total(product, brand, date)
SELECT product, brand, date
FROM raw;