如何合并无共同列且行数相同的SQL表,为每行匹配唯一对应车牌
两张同行数无关联字段表一对一匹配解决方案
你执行的语句属于无关联条件的交叉连接,天然会返回两张表行数相乘的笛卡尔积结果,不符合一对一匹配的需求。解决思路为给两张表分别生成唯一连续行号,按行号关联即可实现行对行的匹配。
主流数据库通用方案(支持窗口函数版本:MySQL8+、SQL Server、PostgreSQL、Oracle等)
使用ROW_NUMBER()窗口函数生成行号后关联:
WITH CarWithRN AS ( SELECT Brand, Miles, -- 如需指定车辆排序规则,可将ORDER BY后的(SELECT NULL)替换为对应字段,例如ORDER BY Miles ASC ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn FROM Car ), PlateWithRN AS ( SELECT NumberPlate, -- 如需指定车牌排序规则,可调整ORDER BY后的内容 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn FROM NewNumberPlate ) SELECT c.Brand, c.Miles, p.NumberPlate INTO #newCars FROM CarWithRN c INNER JOIN PlateWithRN p ON c.rn = p.rn;
低版本MySQL兼容方案(不支持窗口函数的MySQL5.x版本)
使用用户变量生成行号后关联:
SELECT c.Brand, c.Miles, p.NumberPlate INTO #newCars FROM ( SELECT Brand, Miles, @row1 := @row1 + 1 AS rn FROM Car, (SELECT @row1 := 0) t ) c INNER JOIN ( SELECT NumberPlate, @row2 := @row2 + 1 AS rn FROM NewNumberPlate, (SELECT @row2 := 0) t2 ) p ON c.rn = p.rn;
补充说明
如果需要自定义匹配顺序,比如按车辆里程从小到大分配车牌、按车牌号码从小到大匹配车辆,只需调整ROW_NUMBER()中ORDER BY后的字段即可,灵活度很高。
内容的提问来源于stack exchange,提问作者souki
相关产品推荐
相关产品推荐

