首页 > 解决方案 > postgres 在子句中选择查询

问题描述

Postgres 无法在 in 子句中编译查询(无法识别子查询中的表上是否存在列),我引用了一个示例查询

select * from table_a where (id is null or id not in (select distinct id from table_b)) 

此查询在生产中运行良好,但发现数据缺陷并意识到 table_b 中根本没有列 id,即使查询运行也没有任何编译问题

这是一个已知的缺陷还是有人遇到过这个问题?

标签: sqlpostgresqlsubquery

解决方案


来自postgresql 文档:EXISTS (subquery) -> 子查询可以引用来自周围查询的变量,这些变量将在子查询的任何一次评估期间充当常量。

子查询中的列 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)

推荐阅读