我在 Postgres 中有两个类似的表,只有一个 32 字节拉丁字段(简单的 md5 哈希)。 两个表都有大约 30,000,000 行。表格差别不大(10-1000 行不同)
Postgres 是否可以找到这些表之间的差异,结果应该是我上面描述的 10-1000 行。
这不是一个真正的任务,我只是想知道 PostgreSQL 如何处理类似 JOIN 的逻辑。
为了补充现有答案,我使用
row()
函数作为连接条件。这允许您比较整行。例如。我查看对称差异的典型查询如下所示
select *
from tbl1
full outer join tbl2
on row(tbl1) = row(tbl2)
where tbl1.col is null
or tbl2.col is null
如果您想在不知道哪个表比其他表有更多行的情况下找到差异,您可以尝试此选项来获取任一表中存在的所有行:
SELECT * FROM A
WHERE NOT EXISTS (SELECT * FROM B)
UNION
SELECT * FROM B
WHERE NOT EXISTS (SELECT * FROM A)
根据我的经验,子查询中的 NOT IN 需要很长时间。我会通过包容性联接来做到这一点:
DELETE FROM table1 where ID IN (
SELECT id FROM table1
LEFT OUTER JOIN table2 on table1.hashfield = table2.hashfield
WHERE table2.hashfield IS NULL)
然后对另一张桌子进行同样的操作。