gpt4 book ai didi

sql - 子选择损坏的查询应该会导致错误,但会返回行

转载 作者:行者123 更新时间:2023-12-02 17:43:38 25 4
gpt4 key购买 nike

我不明白这种情况下的行为。根据我的理解,带有无效子查询的查询应该会导致错误。但在本例中它返回一些行。

测试数据:

create table test_values ( tst_id number, tst_id2 number, tst_value varchar2( 10 ) );

create table test_lookup ( tst_id number, tst_value varchar2( 10 ) );

insert into test_values( tst_id, tst_id2, tst_value ) values ( 1, 2, 'a' );
insert into test_values( tst_id, tst_id2, tst_value ) values ( 1, 2, 'b' );
insert into test_values( tst_id, tst_id2, tst_value ) values ( 2, 2,'c' );
insert into test_values( tst_id, tst_id2, tst_value ) values ( 2, 2,'d' );

insert into test_lookup( tst_id, tst_value ) values ( 1, 'findMe' );

commit;

按预期工作:

select * from test_values where tst_id in ( select tst_id from test_lookup where tst_value = 'findMe' );

/*
TST_ID TST_ID2 TST_VALUE
---------- ---------- ----------
1 2 b
1 2 a
*/

select tst_id2 from test_lookup where tst_value = 'findMe';
--ORA-00904: "TST_ID2": invalid identifier

但是下面的查询也在检索行,显然是从“test_values”表中获取“test_id2”列,而不是从子查询中所述的“test_lookup”表中获取,尽管不使用别名内部和外部部分。

select * from test_values where tst_id in ( select tst_id2 from test_lookup where tst_value = 'findMe' );

/*
TST_ID TST_ID2 TST_VALUE
---------- ---------- ----------
2 2 c
2 2 d
*/

最佳答案

原因是因为当子查询中不存在非别名列但外部查询中存在非别名列时,Oracle 会假定您引用的是外部查询中的列。

使用别名,您感到困惑的查询将如下所示:

select *
from test_values tv
where tv.tst_id in (select tv.tst_id2
from test_lookup tl
where tl.tst_value = 'findMe');

希望这能让事情变得更清楚吗?

您看到的问题是一个很好的例子,说明了为什么您应该始终使用它们来自的表来标记列 - 这使得维护查询变得更加容易!

关于sql - 子选择损坏的查询应该会导致错误,但会返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34593247/

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