【问题标题】:Unable to filter rows of one table based on data in another table in PostgreSQL无法根据 PostgreSQL 中另一个表中的数据过滤一个表的行
【发布时间】:2020-04-02 15:47:14
【问题描述】:

我的 PostgreSQL 数据库(PG 9.5,x64 Windows)中有两个表 tbl1(552 行)和 tbl2(257 行),它们的行不相等。表 tbl1 和 tbl2 包含以下数据(此处显示示例):

Grp   id   val1   val2   sum
1     1    112    142    5.2
1     2    124    137    6.7
1     3    136    189    6.8
1     4    112    114    9.8
1     5    130    145    6.1
1     6    142    130    7.7

Grp  id    sum
1    1     5.2
1    3     6.8
1    6     7.7

对于表 1 中的每个组,我尝试选择第一个表中的“id”不等于第二个表的“id”的行。例如,我的预期输出是:

Grp   id    val1   val2   sum
1     2     124    137    6.7
1     4     112    114    9.8
1     5     130    145    6.1

到目前为止,我已经尝试过这个查询,但它不起作用,并返回空输出。

SELECT
   a.grp, a.id,
   a.val1, a.val2, a.sum
FROM tbl1 a
WHERE NOT EXISTS (
    SELECT * 
    FROM tbl2 b WHERE b.grp = a.grp AND b.id != a.id
)

有人可以帮忙解释一下我做错了什么吗?

【问题讨论】:

  • 更改为AND b.id = a.id
  • 想发帖作为答案吗?

标签: postgresql


【解决方案1】:

由于您使用的是NOT EXISTS,因此您需要的条件是b.id = a.id 而不是b.id != a.id

...................
WHERE b.grp = a.grp AND b.id = a.id
...................

【讨论】:

    【解决方案2】:

    您的查询的问题是 NOT EXISTS 子句将始终使用您在示例中显示的数据返回 false (对于 a 中的每一行,b 中有一行 grp 相同但 id 不同)。

    带有IS NULL 过滤器的LEFT JOIN 可以解决问题:

    SELECT a.grp, a.id,
        a.val1, a.val2, a.sum
    FROM tbl1 a
    LEFT JOIN tbl2 b ON a.grp = b.grp AND a.id = b.id
    WHERE b.id IS NULL --b.id is null if there is no row in b which matches both a.grp and a.id
    

    【讨论】:

    • 嘿,谢谢你的帮助,我试过了,但是 NULL 的技巧不起作用,干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多