多对多ID关联两表需返回单行:处理CSV格式ID及重复ID问题
解决表B同一ID仅返回第一条记录的关联问题
要实现表B同一ID仅保留第一条记录再与表A关联,核心思路是先对表B做去重处理(按ID分组取第一条),再和表A执行原有关联逻辑。以下是不同主流数据库的实现方案:
通用方案(基于窗口函数,适用于SQL Server、MySQL 8.0+、PostgreSQL)
使用ROW_NUMBER()窗口函数对表B按ID分组,给每组内的记录编号,仅保留编号为1的记录(即每个ID的第一条),再关联表A:
WITH UniqueTableB AS ( SELECT Company, ID, -- 按ID分组,给组内记录编号,无特定排序需求时用(SELECT NULL)/SELECT 1取默认顺序 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS rn FROM tableB ) -- 关联处理后的表B与表A,保留原有关联逻辑 SELECT a.ID AS 表A_ID, a.Name, b.Company, b.ID AS 表B_ID FROM tableA a INNER JOIN UniqueTableB b ON b.ID = a.ID OR a.ID LIKE b.ID + ',%' -- SQL Server写法;MySQL/PostgreSQL替换为CONCAT(b.ID, ',%')或b.ID || ',%'
MySQL 5.x兼容方案(无窗口函数)
如果使用不支持窗口函数的MySQL版本,可以用GROUP BY直接按ID分组,MySQL会默认返回每组的第一条记录:
SELECT a.ID AS 表A_ID, a.Name, b.Company, b.ID AS 表B_ID FROM tableA a INNER JOIN ( SELECT ID, Company FROM tableB GROUP BY ID ) b ON b.ID = a.ID OR a.ID LIKE CONCAT(b.ID, ',%')
效果说明
以你提供的示例数据为例:
- 表B中ID=10023的两条记录,处理后仅保留第一条(Kroc)
- 表A中Bob的ID是
10023,2019,会与处理后的表B中ID=10023的Kroc记录关联,最终结果仅返回Bob对应Kroc的一行记录,符合需求。
内容的提问来源于stack exchange,提问作者Damien
相关产品推荐
相关产品推荐

