【发布时间】:2012-06-29 14:51:22
【问题描述】:
有人知道如何在 Postgresql 中执行这样的查询吗?
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB
WHERE tabB.id = tabA.id
)
当我执行这样的查询时,postgresql 报错“ERROR: Greenplum Database does not yet support that query。”
编辑:这个怎么样:
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB WHERE tabB.id = tabA.id AND tabB.id2 = tabA.id2
)
编辑:
我在 postgresql 8.2.15 中测试了@ypercube 提供的 4 个答案。结论是:
1)正如我在上面的问题中所说,第一个在这个版本的 postgresql 中不起作用。错误消息也可以在那里找到。
2)对于其他三个答案,执行速度为:(3)LEFT JOIN > (4)EXCEPT >> (2)NOT IN。
具体来说,对于语法相同的查询,(3)LEFT JOIN 大约需要 5580ms,(4)EXCEPT 大约需要 13502ms,(2)NOT IN 需要超过 100000(实际上我没有等待它完成)。
NOT IN 子句这么慢有什么特别的原因吗?
程
【问题讨论】:
-
PostgreSQL 8.2 已过时,不再受支持。从那时起,
EXISTS和NOT EXISTS查询的工作方式发生了重大变化。 postgresql.org/support/versioning -
如果您想找到最有效的查询,我认为您首先必须检查表上的索引。您没有提到表的大小,但 5 秒的查询意味着(99%)要么是巨大的表,要么是缺少索引。我建议你添加一个新问题,包括两个表的定义(
CREATE TABLE)、查询和执行计划。
标签: postgresql greenplum