我在PostgreSQL数据库中有两个表,假设raw
和total
表。我想做的是创建一个查询,以检查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
我能想到的是首先用raw
对DELETE
中的行进行重复数据删除
像这样(不确定此查询的正确性,但我只是想简化我的想法)
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
中。但是,在单个查询中是否有更好的方法呢?
答案 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;