Postgresql中的NOT EXISTS子句

iyfjxgzm  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(4)|浏览(135)

有人知道如何在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子句如此缓慢是否有什么特殊原因?**

rkkpypqq

rkkpypqq1#

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

  1. NOT EXISTS相关子查询
  2. NOT IN子查询
    1.带有IS NULL检查的LEFT JOIN
    您发现第一种方法在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中工作)。

d7v8vwbk

d7v8vwbk2#

你漏掉的那部分错误本可以给你指出正确的方向。我想它写的是“细节:该查询包含一个相关子查询。”因此,您必须使用连接或非相关子查询重写这些查询。

SELECT * FROM tabA WHERE id NOT IN (SELECT id FROM tabB);

对于第二个查询,请尝试

SELECT * FROM tabA WHERE (id, id2) NOT IN (SELECT id, id2 FROM tabB);
mefy6pfw

mefy6pfw3#

SELECT * FROM tabA 
WHERE id not in  (SELECT id FROM tabB)
a1o7rhls

a1o7rhls4#

四种方法----
对于此方案,请创建
使用名称和主题创建表A

create table a (
name varchar (30),
subject varchar (40)
);

插入数值

Insert into a values ('abdul', 'math'), ('mashood','science'), ('rehan','urdu'), ('saqib','art');

使用名称和主题创建表B

create table b(
name varchar(30),
subject varchar(40)
);

插入数值

Insert into b values ('abdul', 'math'), ('mashood','hindi'), ('rehan','farsi'), ('saqib','art'),('xyz','math');

从表A中选择:
| 姓名|主语|
| - ------|- ------|
| 阿卜杜勒|数学|
| 弥撒|科学|
| 雷汉|乌尔都语|
| 萨基卜|艺术|
从表B中选择:
| 姓名|主语|
| - ------|- ------|
| 阿卜杜勒|数学|
| 弥撒|印地语|
| 雷汉|波斯语|
| 萨基卜|艺术|
| 某某|数学|
1.未输入

select name,subject from b where name not in ( select name from a where a.name=b.name and a.subject=b.subject );

| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|
1.不存在

select name,subject from b where not exists ( select name from a where a.name=b.name and a.subject=b.subject );

| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|
1.加入

SELECT b.* 
FROM b left JOIN a 
ON  b.name = a.name
AND b.subject = a.subject
WHERE a.name IS  NULL ;

| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|
1.除了

SELECT bm.* FROM b bm
WHERE subject IN 
( SELECT subject FROM b where name=bm.name
EXCEPT
SELECT subject FROM a where name=bm.name
) ;

| 姓名|主语|
| - ------|- ------|
| 弥撒|印地语|
| 雷汉|波斯语|
| 某某|数学|

相关问题