You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多对多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:55:06