【问题标题】:PostgreSQL check if values in a given list exist in a tablePostgreSQL 检查给定列表中的值是否存在于表中
【发布时间】:2022-01-20 20:34:22
【问题描述】:

在 Postgres 中给出下表:

id some_col
1 a
1 b
2 a
3 a

我想将输出作为 id 和 true(如果表中至少存在具有该 id 的一行)或 false(如果在表中找不到具有该 id 的行)。

例如 where id in (1, 2, 3, 4, 5):

id value
1 true
2 true
3 true
4 false
5 false

我尝试使用 group by 和 case with conditions,但是否有任何优化/性能 SQL 方法来实现这一点? Bcz,groupby 确实完成了行数,这在这种情况下是不必要的。而且,对于exists 查询,我没有找到处理多行返回的方法;

提前致谢!

【问题讨论】:

  • 您需要 OUTER JOIN 值 1 - 5。

标签: sql postgresql performance optimization query-optimization


【解决方案1】:

in 子句不会这样做。您需要以某种方式构建一个值列表(values 表值构造函数在大多数 rdbms 中工作)并与之进行外部连接:

SELECT x.id, EXISTS (
    SELECT *
    FROM t
    WHERE t.id = x.id
) AS value
FROM (VALUES (1), (2), (3), (4), (5)) AS x(id)

【讨论】:

  • 您能否解释一下这是否会在内部计算每个 id 的所有行? Bcz 对于每个 id,在我的情况下我可能有数千行。我想消除它。
  • 您不需要CASE 表达式。 EXISTS() 已经产生了一个布尔值。
  • 会limit 1 子查询帮助您回答吗?
  • 在答案的子查询中添加了限制 1。有效。谢谢。
  • @Forece85 不需要限制。它被包裹在 exists 中,所以基本上这意味着检查是否存在行 - 1 行或 1000 行无关紧要。
猜你喜欢
  • 2015-03-06
  • 2015-08-25
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多