SQL Server无主键时基于共同列关联表的匹配问题
解决重复记录的准确关联问题
你遇到的核心问题是重复分组内的记录没有唯一关联依据,仅靠Name和Units_sold关联会产生笛卡尔积,导致无法对应每条记录。这里提供一个用窗口函数添加行号的方案,能帮你实现准确匹配:
思路说明
既然原来的Table1_Id关联字段不可用,我们可以给每个重复的Name + Units_sold分组内的记录添加一个递增的行号,然后通过Name + Units_sold + 行号来关联两张表,确保同组内的第一条记录对应第一条,第二条对应第二条。
完整SQL示例
SELECT t1.Id, t1.Name, t1.Units_sold, t2.Excess_units FROM ( -- 给Table1的重复分组添加行号,按自身Id排序保证顺序稳定 SELECT *, ROW_NUMBER() OVER (PARTITION BY Name, Units_sold ORDER BY Id) AS row_num FROM Table1 ) t1 INNER JOIN ( -- 给Table2的重复分组添加行号,按原Table1_Id排序(如果这个字段仍有顺序意义) SELECT *, ROW_NUMBER() OVER (PARTITION BY Name, Units_sold ORDER BY Table1_Id) AS row_num FROM Table2 ) t2 ON t1.Name = t2.Name AND t1.Units_sold = t2.Units_sold AND t1.row_num = t2.row_num
关键细节解释
PARTITION BY Name, Units_sold:把两张表中Name和Units_sold相同的记录分成一组,每组单独生成行号。ORDER BY Id/ORDER BY Table1_Id:用表中的唯一ID排序,确保每组内行号的生成顺序是固定的,不会因为执行顺序变化导致匹配错乱。如果你的表没有类似的唯一ID,可以尝试用其他有顺序意义的字段排序(比如创建时间,若存在)。- 这个方案适用于大部分支持窗口函数的数据库(如MySQL 8.0+、PostgreSQL、SQL Server等)。
内容的提问来源于stack exchange,提问作者heyNow
相关产品推荐
相关产品推荐

