我希望失败的子查询因为它引用了一个不存在的列,实际上会返回子查询中引用的表的所有行。这是postgresql中的预期行为还是postgresql错误?
模拟问题:
create table zz_temp_01
(
column_a varchar(20),
column_b int
)
;
create table zz_temp_02
(
column_c int,
column_d varchar(20)
)
;
insert into zz_temp_01
values
('test1', 1),
('test2', 2)
;
insert into zz_temp_02
values
(1, 'Monday'),
(2, 'Tuesday'),
(3, 'Wednesday'),
(4, 'Thursday'),
(5, 'Friday'),
(6, 'Saturday'),
(7, 'Sunday')
;
select * from zz_temp_02
where column_c in
(select column_c from zz_temp_01)
;
此查询显然不正确,因为子查询在应该使用column_b时从表zz_temp_01引用column_c。执行“从zz_temp_01中选择column_c”会导致错误:列“column_c”不存在。但是,如果执行整个查询,则结果为:
1;"Monday"
2;"Tuesday"
3;"Wednesday"
4;"Thursday"
5;"Friday"
6;"Saturday"
7;"Sunday"
这是完整的zz_temp_02表。我原本期望查询在错误条件下失败或至少不返回任何行。
答案 0 :(得分:1)
不,这是SQL标准所要求的正确行为。
有关更详细的说明,请参阅this mail thread
一个普遍的抱怨,但不幸的是,这是必须的 教训。
子查询中对column_c的引用来自zz_temp_02 - 其中包含 这种情况使得where子句(zz_temp_02.column_c IN (zz_temp_02.column_c))
总是评估为真。
我用问题中的那些替换了邮件线程中的列名和表名,但引用没有改变。
答案 1 :(得分:0)
试试这个
从zz_temp_02中选择* 其中column_c在 (从zz_temp_01中选择column_B) ;