SELECT语句中关联子查询仅返回单行的原因及全量行返回方法
现象产生原因
你遇到的这个问题本质是标量子查询的返回值约束,和关联子查询本身无关:
- 当子查询写在
SELECT语句的列列表位置,充当单个返回列的取值时,SQL标准强制要求这类子查询(即标量子查询)最多只能返回「1行1列」的单个标量值,不能返回多行多列的结果集。 - 不同数据库对违反该规则的处理逻辑不同:Oracle、PostgreSQL等数据库会直接抛出"子查询返回多行"的错误终止查询;MySQL等数据库会做静默兼容,直接丢弃第一行之外的所有匹配结果,只返回第一行的
automic_param值,也就是你观察到的现象。
是否为关联子查询的固有特性
不属于。
关联子查询的定义只是"子查询内部引用了外层查询的字段,需要随外层查询的逐行遍历动态执行匹配",本身没有限制返回行数。你遇到的问题是子查询放置的位置不符合SQL语法对该位置的返回值要求,和关联子查询的逻辑特性没有关系。哪怕是非关联的子查询,如果写在SELECT列位置且返回多行,一样会出现同类问题。
正确修改方式
不要把返回多行的子查询放在SELECT列的标量位置,改用表连接(JOIN)的方式做关联即可返回所有匹配结果:
SELECT o.automic_param FROM pp_job j INNER JOIN pp_odate o ON j.jobset_id = o.jobset_id AND j.job_id = o.job_id WHERE j.jobset_id = 'ABC' AND j.job_id = 'cba1';
如果需要保留
pp_job中没有对应pp_odate匹配记录的行,可以把INNER JOIN替换为LEFT JOIN。
内容的提问来源于stack exchange,提问作者Abishek J
相关产品推荐
相关产品推荐

