sql - 子查询中的错误返回查询的所有数据
问题描述
我有以下数据结构:
用户:
- ID
- 姓名
- status_id
邮政:
- ID
- 标题
- 用户身份
以下查询返回所有博客行
select * from Post where user_id in (select user_id from User where status_id = 7);
虽然子查询
select user_id from User where status_id = 7
是错误的,如果单独执行,它会返回错误“错误:列“user_id”不存在”。是什么导致了这种行为?
解决方案
中没有user_id
列user
,因此 Postgres 将其理解为对user_id
of的引用,该引用post
同时存在于外部范围和子查询 post 中:过滤变为无操作,并返回所有行post
(只要user_id
不是null
)。
如果你要限定列名,你会得到你期望的错误:
select p.*
from post p
where p.user_id in (select u.user_id from user u where u.status_id = 7);
不相关的旁注:我会将查询exists
改为:
select p.*
from post p
where exists (select 1 from user u where u.status_id = 7 and u.id = p.user_id)
此查询将利用user(id, status_id)
.