如何让SQL子查询引用外层WHERE子句的fieldid值?
可行!但需要调整子查询的关联逻辑
当然可以实现你的需求——让子查询逐行引用外层tablea中fieldid的值,不过你当前的SQL写法有语法问题,得改一下子查询的关联方式。
问题出在哪?
你写的list_of_ids[i]不是标准SQL语法,数据库没法识别这种“数组索引”的写法,而且这也不是关联外层查询字段的正确方式。
修正后的SQL写法
直接让子查询关联外层tablea的fieldid字段就行,数据库会自动为外层的每一行执行一次子查询,匹配对应的fieldid:
select fielda, fieldb, -- 子查询直接引用外层tablea的fieldid (select sum(field1) - sum(field2) as fieldc from tableb where fieldid = tablea.fieldid) as fieldc from tablea where fieldid in (123, 456, 789);
比如当外层tablea的行fieldid是123时,子查询就会计算tableb中所有fieldid=123的sum(field1)-sum(field2);当fieldid是456时,子查询就匹配456,完全符合你的预期。
更高效的替代方案(推荐)
如果你的数据量较大,上面的相关子查询(每行都执行一次子查询)可能会有性能问题。可以先对tableb做聚合,再和tablea关联,这样只需要一次聚合操作:
select a.fielda, a.fieldb, -- 用coalesce处理tableb中无对应数据的情况,避免返回NULL coalesce(b.fieldc, 0) as fieldc from tablea a left join ( -- 预先按fieldid聚合计算fieldc select fieldid, sum(field1) - sum(field2) as fieldc from tableb group by fieldid ) b on a.fieldid = b.fieldid where a.fieldid in (123, 456, 789);
用left join可以保证tablea中所有符合条件的行都能被返回,coalesce则可以把tableb中没有对应fieldid时的NULL替换成你需要的默认值(比如0)。
内容的提问来源于stack exchange,提问作者DeadlyWonky
相关产品推荐
相关产品推荐

