oracle中存在=,IN的行为和行为存在

时间:2016-05-07 17:40:03

标签: oracle oracle10g

当我运行以下两个查询时,我得到相同的结果:

select * from bambam where name in(select name from bambam1 where bambam1.name=bambam.name);

select * from bambam where name =(select name from bambam1 where bambam1.name=bambam.name);

我的第一个问题是IN=之间的区别是什么?

我的第二个问题是,当我运行子查询的select部分(select name from bambam1 where bambam1.name=bambam.name)时,我收到以下错误,为什么?

  

第1行的错误

     

ORA-00904:" BAMBAM"。" NAME":无效的标识符

我有两张表格如下:

BAMBAM:

NAME DATE1    
---- ---------
gha  07-MAY-16

gh   12-DEC-12

abc       

BAMBAM1

NAME
----
gh  
abc 

2 个答案:

答案 0 :(得分:0)

ImportTableA.sql -> v1.7 ProcessTableA.sql -> v1.2 TableAReport.sql -> v3.0 IN之间没有区别,只要您100%确定子查询总是最多返回一行。 =的工作方式如下:IN表示 - 按定义! - 与where x in (1, 2, 3)相同。特别是,如果括号中的列表只有一个元素:where x = 1 or x = 2 or x = 3表示与where x in (1)完全相同。

此外,当子查询未返回任何结果时,where x = 1查询和IN查询都不返回任何行。这是您对=查询所期望的。对于IN查询,Oracle应该抱怨(抛出错误),但Oracle(公司)决定在这种情况下简单地不返回任何结果,而不是抛出错误。但是,如果子查询返回多个结果,那么=查询将返回与<{>> 值IN的子查询的结果一样多的行,而name查询将显示错误消息。

因此,对于=中的名称gha,子查询不返回任何结果,因此两个“较大”查询都不返回bambam的行。对于gha,子查询只返回一个结果gh - 所以“较大”或“外部”查询都返回gh。与gh相同。

对于您的其他问题,表格是否在您展示时非常准确?一个是bambam,另一个是bambam2,但在查询中你指的是bambam1?如果是这样,你有答案。如果没有,请注意细节。祝你好运!

答案 1 :(得分:0)

对于问题的第二部分:如果只运行此查询:

select name from bambam1 where bambam1.name=bambam.name

bambam是一个未知标识符,因为它不会作为行源的名称或别名出现在查询中。

运行完整查询时,它会从主FROM子句中解析bambam。当您将子查询单独拉出时,该上下文就消失了。