gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:49:41 25 4
gpt4 key购买 nike

一个我预计会失败的子查询,因为它引用了一个不存在的列,实际上返回了子查询中引用的表的所有行。这是 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。执行“select column_c from zz_temp_01”会报错:列“column_c”不存在。但是,如果执行整个查询,则结果为:

1;"Monday"
2;"Tuesday"
3;"Wednesday"
4;"Thursday"
5;"Friday"
6;"Saturday"
7;"Sunday"

这是完整的 zz_temp_02 表。我原以为查询会因错误情况而失败,或者至少不返回任何行。

最佳答案

不,这是 SQL 标准要求的正确行为。

有关更详细的说明,请参阅 this mail thread

A common complaint but unfortunately something that simply has to be learned.

The reference to column_c in the subquery comes from zz_temp_02 - which in this case makes the where clause (zz_temp_02.column_c IN (zz_temp_02.column_c)) ​which will always evaluate to true.


我用问题中的名称替换了邮件线程中的列名和表名,但引用没有改变。

关于sql - postgresql 子查询在无效列上失败时返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39220363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com