sql - postgres 在子句中选择查询
问题描述
Postgres 无法在 in 子句中编译查询(无法识别子查询中的表上是否存在列),我引用了一个示例查询
select * from table_a where (id is null or id not in (select distinct id from table_b))
此查询在生产中运行良好,但发现数据缺陷并意识到 table_b 中根本没有列 id,即使查询运行也没有任何编译问题
这是一个已知的缺陷还是有人遇到过这个问题?
解决方案
来自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)
推荐阅读
- swift - 带有协议元素的数组不能调用数组扩展方法
- javascript - Javascript 布尔比较不起作用。如何解决?
- linkedin - #LinkedIn 如何让 App 获得 r_1st_connections 权限
- design-patterns - 如何在 Rust 的装饰器模式中使用生命周期说明符?
- javafx - 如何为 MacOS 捆绑 .jar 文件?
- codeigniter - 带有 codeigniter 的存储过程
- php - 检查文件名是否包含用于文件(图像)上传的 %2F
- android - 我的android项目中resp下的styles.xml文件有错误(compile-error-content-is-not-allowed-in-prolog)
- c# - Microsoft.Azure.WebJobs.Host:无法将参数“myContext”绑定到类型 DataContext。Azure 函数 v2 中的错误
- python-3.x - 从 .pdftypes 导入 PDFObjectNotFound ImportError:无法导入名称“PDFObjectNotFound”