【问题标题】:postgres select query in clausepostgres 在子句中选择查询
【发布时间】:2021-06-25 20:26:52
【问题描述】:
Postgres 无法在 in 子句中编译查询(无法识别子查询中的表上是否存在列),我引用了一个示例查询
select * from table_a where (id is null or id not in (select distinct id from table_b))
此查询在生产中运行良好,但发现数据缺陷并意识到 table_b 中根本没有列 id,即使该查询在运行时没有任何编译问题
这是一个已知的缺陷还是有人遇到过这个问题?
【问题讨论】:
标签:
sql
postgresql
subquery
【解决方案1】:
来自postgresql documentation:EXISTS(子查询)-> 子查询可以引用来自周围查询的变量,这些变量将在子查询的任何一次评估期间充当常量。
子查询中的列id指的是table_a,而不是table_b(table_b没有名为id的列)。
所有这些查询都是等价的:
SELECT *
FROM table_a
WHERE table_a.id IN (SELECT table_a.id)
SELECT *
FROM table_a
WHERE table_a.id IN (SELECT id)
SELECT *
FROM table_a
WHERE table_a.id IN (SELECT id FROM table_b)
SELECT *
FROM table_a
WHERE table_a.id IN (SELECT table_a.id FROM table_b)
此查询失败(table_b.id 列不存在):
SELECT *
FROM table_a
WHERE table_a.id NOT IN (SELECT table_b.id FROM table_b)