postgresql子查询在无效列失败时返回行

时间:2016-08-30 06:35:56

标签: sql postgresql

我希望失败的子查询因为它引用了一个不存在的列,实际上会返回子查询中引用的表的所有行。这是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表。我原本期望查询在错误条件下失败或至少不返回任何行。

2 个答案:

答案 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) ;