有人知道如何在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)左连接〉(4)除外〉〉(2)不输入。
具体地说,对于具有相同语法的查询,(3)LEFT JOIN花费大约5580ms,(4)EXCEPT花费大约13502ms,(2)NOT IN花费超过100000(事实上,我没有等到它完成)。
- NOT IN子句如此缓慢是否有什么特殊原因?**
郑
4条答案
按热度按时间rkkpypqq1#
有3种(主要)方法可以进行此类查询:
NOT EXISTS
相关子查询NOT IN
子查询1.带有
IS NULL
检查的LEFT JOIN
:您发现第一种方法在Greenplum中确实有效。@Marco和@juergen提供了第二种方法。下面是第三种方法,它可以绕过Greenplum的限制:
这(第四种方式)也适用于Postgres(支持
EXCEPT
运算符):在SQL-Fiddle中测试(所有4个都在Postgres中工作)。
d7v8vwbk2#
你漏掉的那部分错误本可以给你指出正确的方向。我想它写的是“细节:该查询包含一个相关子查询。”因此,您必须使用连接或非相关子查询重写这些查询。
对于第二个查询,请尝试
mefy6pfw3#
a1o7rhls4#
四种方法----
对于此方案,请创建
使用名称和主题创建表A
插入数值
使用名称和主题创建表B
插入数值
从表A中选择:
| 姓名|主语|
| - ------|- ------|
| 阿卜杜勒|数学|
| 弥撒|科学|
| 雷汉|乌尔都语|
| 萨基卜|艺术|
从表B中选择:
| 姓名|主语|
| - ------|- ------|
| 阿卜杜勒|数学|
| 弥撒|印地语|
| 雷汉|波斯语|
| 萨基卜|艺术|
| 某某|数学|
1.未输入
| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|
1.不存在
| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|
1.加入
| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|
1.除了
| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|