加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Postgresql中的NOT EXISTS子句

发布时间:2020-12-13 16:29:17 所属栏目:百科 来源:网络整理
导读:任何人都知道如何在Postgresql中执行这样的查询? SELECT * FROM tabA WHERE NOT EXISTS ( SELECT * FROM tabB WHERE tabB.id = tabA.id) 当我执行这样的查询,postgresql抱怨“错误:Greenplum数据库还不支持该查询”. 编辑:这个怎么样? SELECT * FROM tab
任何人都知道如何在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种(主要)方式来做这种查询:

> NOT EXISTS相关子查询
> NOT IN子查询
> LEFT JOIN with IS 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 ;

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

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

测试在SQL-Fiddle(所有4工作在Postgres).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读