基于CAT和GROUP匹配将Table1数据导入Table2的SQL需求
解决方案:生成同组内CODE的交叉配对记录
这是一个典型的同组内自关联生成配对的需求,我来给你提供适用于大多数关系型数据库的SQL实现方案:
核心思路
我们需要先筛选出[CAT]+[GROUP]组合下条目数大于1的组,然后将这些组内的记录与自身进行关联,排除CODE相同的情况,就能得到每个CODE对应的其他组内CODE,最后将结果插入到Table2中。
通用SQL实现(支持CTE的数据库,如SQL Server、PostgreSQL、MySQL 8.0+)
WITH ValidGroups AS ( SELECT [CAT], [GROUP] FROM Table1 GROUP BY [CAT], [GROUP] HAVING COUNT(*) > 1 ) INSERT INTO Table2 ([CODE], [ALTERNATECODE]) SELECT t1.[CODE], t2.[CODE] AS [ALTERNATECODE] FROM Table1 t1 JOIN ValidGroups vg ON t1.[CAT] = vg.[CAT] AND t1.[GROUP] = vg.[GROUP] JOIN Table1 t2 ON t2.[CAT] = vg.[CAT] AND t2.[GROUP] = vg.[GROUP] WHERE t1.[CODE] != t2.[CODE];
兼容旧版本数据库的实现(子查询替代CTE)
如果你的数据库不支持CTE(比如MySQL 5.x),可以用子查询改写:
INSERT INTO Table2 ([CODE], [ALTERNATECODE]) SELECT t1.[CODE], t2.[CODE] AS [ALTERNATECODE] FROM Table1 t1 JOIN ( SELECT [CAT], [GROUP] FROM Table1 GROUP BY [CAT], [GROUP] HAVING COUNT(*) > 1 ) vg ON t1.[CAT] = vg.[CAT] AND t1.[GROUP] = vg.[GROUP] JOIN Table1 t2 ON t2.[CAT] = vg.[CAT] AND t2.[GROUP] = vg.[GROUP] WHERE t1.[CODE] != t2.[CODE];
代码说明
- ValidGroups:这个CTE(或子查询)先筛选出所有符合条件的组——也就是
[CAT]+[GROUP]组合下条目数大于1的组,避免处理不需要生成记录的单条目组。 - 自连接Table1:将t1和t2都关联到有效组,确保只在同一组内进行配对,同时通过
WHERE t1.[CODE] != t2.[CODE]排除CODE自身配对的情况。 - 插入结果:将配对后的CODE和ALTERNATECODE插入到Table2中,完全符合你给出的示例结果。
验证规则
- 组内有2个条目时,生成
2*(2-1)=2条记录,和示例一致; - 组内有3个条目时,生成
3*(3-1)=6条记录,和示例一致; - 组内有5个条目时,生成
5*(5-1)=20条记录,和示例中的对应部分完全匹配。
内容的提问来源于stack exchange,提问作者AquaAlex
相关产品推荐
相关产品推荐

