SELECT子句中WHERE与JOIN关联的差异及ORA-01427问题解惑
为什么第一个子查询返回多行报错,第二个却能正常返回多行结果?
先看你给出的两个查询及报错信息:
第一个查询:
select id,(SELECT N.NAME FROM memuat.NETWORK N join memuat.host H on N.ID = H.NETWORK ) as network_name from memuat.host;
执行后报错:
ORA-01427: single-row subquery returns more than one row 01427. 00000 - "single-row subquery returns more than one row"
第二个查询:
select id,(SELECT N.NAME FROM memuat.NETWORK N where N.ID = H.NETWORK ) as network_name from memuat.host H;
可正常运行并返回多行结果。
核心区别:子查询是否与外部查询关联
- 第一个查询的子查询是独立子查询:它内部自行关联了
memuat.host表,执行时会直接返回所有主机对应的网络名称(多行数据)。但外部查询要求这个子查询为每一行host返回单个值,子查询返回多行不符合要求,因此触发报错。 - 第二个查询的子查询是关联子查询:它引用了外部查询中
H.NETWORK的值(也就是当前正在处理的那一行host的NETWORK字段值)。相当于对外部查询的每一行host,单独执行一次子查询——用当前行的NETWORK值匹配NETWORK表的ID。只要NETWORK表的ID是唯一的(比如主键),这个子查询每次只会返回一行结果,刚好对应当前host所属的网络名称。外部查询循环处理每一行host,最终输出多行数据,每行对应一个host的id和它的network_name。
简单来说,第一个子查询是一次性返回所有匹配的网络名,第二个是针对每个主机单独查找它对应的那个网络名,所以不会返回多行。
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

