select 的行为和 =,IN, 的行为存在于 oracle 中
Behavior of select and behaviour of =,IN, Exists in oracle
当我 运行 以下两个查询时,我得到相同的结果:
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 name from bambam1 where bambam1.name=bambam.name
) 的 select
部分时,出现以下错误,为什么?
Error at line 1
ORA-00904: "BAMBAM"."NAME": invalid identifier
我有 2 个表格如下:
BAMBAM:
NAME DATE1
---- ---------
gha 07-MAY-16
gh 12-DEC-12
abc
BAMBAM1
NAME
----
gh
abc
IN
和 =
之间没有区别,只要您 100% 确定子查询总是 return 最多一行。 IN
是这样工作的: where x in (1, 2, 3)
意味着 - 根据定义! - 与 where x = 1 or x = 2 or x = 3
相同。特别是,如果括号中的列表只有一个元素:where x in (1)
与 where x = 1
.
的含义完全相同
此外,当子查询 return 没有结果时,IN
查询和 =
查询 return 都没有行。这是您对 IN
查询应该期望的结果。对于 =
查询,Oracle 应该抱怨(抛出错误),但 Oracle(公司)决定在这种情况下也只是 return 没有结果,而不是抛出错误。然而,如果子查询 returns 多于一个结果,那么 IN
查询将 return 与 each[=40] 子查询的结果一样多的行=] name
的值,而 =
查询将显示一条错误消息。
因此,对于 bambam
中的名称 gha
,子查询 return 没有结果,因此两个 "larger" 查询 return 没有行 gha
。对于 gh
,子查询 return 只有一个结果,gh
- 因此 "larger" 或 "outer" 查询两个 return gh
。与 abc
.
相同
关于你的另一个问题,表格真的和你展示的一样吗?一个是 bambam,另一个是 bambam2,但在查询中您指的是 bambam1?如果是这样,你有你的答案。如果不是,请注意细节。祝你好运!
对于你问题的第二部分:如果你运行只是这个查询:
select name from bambam1 where bambam1.name=bambam.name
bambam
是未知标识符,因为它不会作为行源的名称或别名出现在查询中。
当您 运行 完整查询时,它会从主 FROM 子句解析 bambam
。当你自己拉出子查询时,那个上下文就消失了。
当我 运行 以下两个查询时,我得到相同的结果:
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 name from bambam1 where bambam1.name=bambam.name
) 的 select
部分时,出现以下错误,为什么?
Error at line 1
ORA-00904: "BAMBAM"."NAME": invalid identifier
我有 2 个表格如下:
BAMBAM:
NAME DATE1
---- ---------
gha 07-MAY-16
gh 12-DEC-12
abc
BAMBAM1
NAME
----
gh
abc
IN
和 =
之间没有区别,只要您 100% 确定子查询总是 return 最多一行。 IN
是这样工作的: where x in (1, 2, 3)
意味着 - 根据定义! - 与 where x = 1 or x = 2 or x = 3
相同。特别是,如果括号中的列表只有一个元素:where x in (1)
与 where x = 1
.
此外,当子查询 return 没有结果时,IN
查询和 =
查询 return 都没有行。这是您对 IN
查询应该期望的结果。对于 =
查询,Oracle 应该抱怨(抛出错误),但 Oracle(公司)决定在这种情况下也只是 return 没有结果,而不是抛出错误。然而,如果子查询 returns 多于一个结果,那么 IN
查询将 return 与 each[=40] 子查询的结果一样多的行=] name
的值,而 =
查询将显示一条错误消息。
因此,对于 bambam
中的名称 gha
,子查询 return 没有结果,因此两个 "larger" 查询 return 没有行 gha
。对于 gh
,子查询 return 只有一个结果,gh
- 因此 "larger" 或 "outer" 查询两个 return gh
。与 abc
.
关于你的另一个问题,表格真的和你展示的一样吗?一个是 bambam,另一个是 bambam2,但在查询中您指的是 bambam1?如果是这样,你有你的答案。如果不是,请注意细节。祝你好运!
对于你问题的第二部分:如果你运行只是这个查询:
select name from bambam1 where bambam1.name=bambam.name
bambam
是未知标识符,因为它不会作为行源的名称或别名出现在查询中。
当您 运行 完整查询时,它会从主 FROM 子句解析 bambam
。当你自己拉出子查询时,那个上下文就消失了。