gpt4 book ai didi

postgresql - Postgresql 中的 NOT EXISTS 子句

转载 作者:行者123 更新时间:2023-11-29 11:09:33 31 4
gpt4 key购买 nike

有人知道如何在 Postgresql 中执行这样的查询吗?

SELECT * 
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB
WHERE tabB.id = tabA.id
)

当我执行这样的查询时,postgresql 提示“错误:Greenplum 数据库尚不支持该查询。”

编辑:这个怎么样:

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(实际上我没有等待 util 它完成的)。
NOT IN 子句这么慢有什么特别的原因吗?

最佳答案

有 3 种(主要)方法可以进行这种查询:

  1. NOT EXISTS相关子查询

  2. NOT IN 子查询

  3. LEFT JOINIS NULL 检查:

您发现第一种方法在 Greenplum 中确实有效。 @Marco 和@juergen 提供了第二种方式。这是第三个,它可能会绕过 Greenplum 的限制:

SELECT tabA.* 
FROM
tabA
LEFT JOIN
tabB
ON tabB.id = tabA.id
AND tabB.id2 = tabA.id2
WHERE tabB.id IS NULL ;

这(第 4 种方式)也适用于 Postgres(支持 EXCEPT 运算符):

SELECT a.*
FROM a
WHERE id IN
( SELECT id
FROM a
EXCEPT
SELECT id
FROM b
) ;

测试于 SQL-Fiddle (所有 4 个都在 Postgres 中工作)。

关于postgresql - Postgresql 中的 NOT EXISTS 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11238642/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com