首页 > 解决方案 > 子查询中的错误返回查询的所有数据

问题描述

我有以下数据结构:

用户:

邮政:

以下查询返回所有博客行

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”不存在”。是什么导致了这种行为?

标签: sqlpostgresqlsubquerywhere-clausecorrelated-subquery

解决方案


中没有user_iduser,因此 Postgres 将其理解为对user_idof的引用,该引用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).


推荐阅读