如何编写Select语句实现单表记录与另一表分组子集的关联合并
实现思路与SQL方案
核心逻辑梳理
- 首先提取A表中符合
area = 'a1'且rmid = 1的基准记录 - 提取B表中
pid = 999(对应A表area=a1下rmset=yes的rmid值)的所有记录,同时获取这些记录去重后的setid集合 - 给每个setid都拼接上A表的基准记录,再和B表的有效记录合并,排序后即可得到和示例C完全一致的结果
可行SQL语句
SELECT area, rmid, setid FROM ( -- 第一部分:每个setid对应拼接A表的基准记录(rmid=1的a1记录) SELECT a.area, a.rmid, b_set.setid FROM A a CROSS JOIN ( -- 取B表符合条件的所有去重setid SELECT DISTINCT setid FROM B WHERE pid = (SELECT rmid FROM A WHERE area = 'a1' AND rmset = 'yes') ) b_set WHERE a.area = 'a1' AND a.rmid = 1 UNION ALL -- 第二部分:B表符合条件的业务记录,补全area字段为a1 SELECT 'a1' AS area, b.rmid, b.setid FROM B WHERE pid = (SELECT rmid FROM A WHERE area = 'a1' AND rmset = 'yes') ) res -- 按setid、rmid排序和示例C输出顺序一致 ORDER BY setid, rmid;
补充说明
- 语句没有硬编码999,通过关联A表的条件动态取对应rmid作为B表的pid筛选条件,兼容性更强
- 如果业务上确定pid固定为999,也可以直接把子查询替换为
pid=999,执行效率更高 - 最终输出结果和示例C的结构、数据完全匹配
内容的提问来源于stack exchange,提问作者Lusine Yakovleva
相关产品推荐
相关产品推荐

