当前位置: 首页 > 面试题库 >

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

谭繁
2023-03-14
问题内容

我不了解这种情况下的行为。据我了解,带有无效子查询的查询应导致错误。但在此示例中,它返回一些行。

测试数据:

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');

希望这可以使事情变得更清楚?

您所看到的问题是一个很好的示例,说明了为什么始终应使用列来自哪个表来标记您的列-这样可以更轻松地维护查询的开始!



 类似资料:
  • 当“事件ID”与“用户ID”匹配时,im会尝试从我的“事件”表中选择所有数据。然而,我得到一个错误1242,子查询返回超过1行。 我理解我的子查询将返回多行,因为一个用户可以参加多个事件。那么我如何使我的查询接受多行呢?

  • 问题内容: 此查询有什么问题? 我有错误 ORA-01427:单行子查询返回多个行 01427。00000-“单行子查询返回多个行” 问题答案: 这是您的查询: 这样使用的子查询称为 标量子查询 。可以在可以使用标量值(即单个值,例如数字或字符串)的地方使用此类子查询。 标量子查询必须满足两个条件: 它最多返回一行。 它返回一列。 您的解决方案很简单,使用以下命令: 或者,在Oracle 12C中

  • 问题内容: 当我尝试运行以下查询时出现错误: 是什么导致此错误? 问题答案: 将一个返回多列的子查询放在列表中,然后从中选择。 首先,相关子查询将是一个坏主意。但是,您的查询甚至没有关联,但是 没有关联 (没有链接到外部查询),并且似乎返回了多行。这导致产生笛卡尔积的(可能非常昂贵且荒谬的)交叉连接,可能不是您的(秘密)意图。 看起来您确实想要: 两者也都是毫无意义的。WHERE条件将一个强制为a

  • 我有一个RecyclerView适配器,它可以处理我已经使用多年的几种视图类型。最近,我发现了关于,但我似乎遇到了一个问题,它似乎为返回了错误的值。 我有一个用例,我想显示一个标题,下面是一个项目列表。我已经为标题创建了一个新的适配器类,但是列表项将继续使用我的旧适配器(它还处理其他几种视图类型)。 因此,我连接了两个适配器: 这工作正常,但是当我打开活动时,它立即崩溃并给出错误: JAVAlan

  • 问题内容: 如果返回0行,那么我需要。是否可以在带有条件语句的单个MySQL查询中执行此操作? 编辑: 所有答案均有效,但前提是两个查询均从同一表(或具有相同列数的表)中选择。如果第二个查询应用于具有联接的其他表上怎么办? 让我写下我的查询以使问题更清楚: 第一: 如果第一个结果为空,则: 第二名: 如果返回第一个查询,我将使用第一个查询的行,否则将使用第二个查询。 问题答案: 从我刚刚进行的快速

  • 在最新版本的Xcode中构建应用程序时,我会遇到以下错误: 致命错误:格式错误或损坏的AST文件:“无法加载模块”/users/me/library/developer/xcode/developer/xcode/deriveddata/moduleCache/xyzyie6zv0op/darwin.pcm“:找不到文件”注意:修改系统标头后,请删除位于“/users/me/library/dev