当我运行以下两个查询时,我得到相同的结果:
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
答案 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
。当您将子查询单独拉出时,该上下文就消失了。