无需函数/存储过程,用循环遍历不同ID执行SQL查询并合并结果
无需循环/存储过程的批量查询解决方案
你要的逐个ID查询并追加结果的需求,完全不需要用循环——关系型数据库天生擅长集合操作,直接用下面的方法就能实现相同效果,而且效率比循环高得多:
方法一:IN子句直接匹配
直接把所有唯一ID作为过滤条件,一次性获取所有匹配的结果,相当于自动合并了每个ID的查询结果:
SELECT xyz... -- 替换成你实际要查询的字段 FROM 你的目标表 -- 替换成执行查询的表名 WHERE num IN (SELECT DISTINCT id FROM table1)
方法二:JOIN关联查询
通过表关联的方式,直接匹配所有符合条件的记录,结果同样是合并后的全集:
SELECT t.xyz... -- 替换成你实际要查询的字段 FROM 你的目标表 t -- 替换成执行查询的表名,别名t JOIN (SELECT DISTINCT id FROM table1) t1 ON t.num = t1.id
(可选)模拟循环逻辑(不推荐)
如果非要模拟“逐个循环执行”的逻辑,且不能用存储过程,可以用递归CTE实现,但这种方法效率远低于上面的集合操作,仅作演示:
-- MySQL/SQL Server等支持递归CTE的数据库可用 WITH RECURSIVE id_list AS ( SELECT DISTINCT id, ROW_NUMBER() OVER () AS rn FROM table1 ), loop_query AS ( -- 初始查询:第一个ID SELECT rn, (SELECT xyz... FROM 你的目标表 WHERE num = id_list.id) AS result_col FROM id_list WHERE rn = 1 UNION ALL -- 递归迭代:逐个处理下一个ID SELECT il.rn, (SELECT xyz... FROM 你的目标表 WHERE num = il.id) AS result_col FROM id_list il JOIN loop_query lq ON il.rn = lq.rn + 1 ) -- 提取所有循环结果 SELECT result_col FROM loop_query;
实际业务里优先用前两种方法,递归CTE只是为了满足“模拟循环”的形式需求,没有性能优势。
内容的提问来源于stack exchange,提问作者analyst92
相关产品推荐
相关产品推荐

