Left Outer Join关联两表返回冗余行问题求助
解决表关联后行数过多的问题
当前使用left outer join仅通过CaseID关联时,若表1和表2中同一CaseID存在多行数据,会触发笛卡尔积,导致结果行数大幅增加(比如CaseID=114在表1有2行、表2有2行,关联后会生成4行),最终返回22行而非预期的11行。
方案一:利用同CaseID的CreatedDate唯一性去重关联
由于表2中同一CaseID对应的CreatedDate完全相同,可先对表2按CaseID和CreatedDate去重,再与表1左连接:
SELECT t1.Id, t1.Name, t1.CaseID, t2.CreatedDate FROM table1 t1 LEFT JOIN ( SELECT DISTINCT CaseID, CreatedDate FROM table2 ) t2 ON t1.CaseID = t2.CaseID;
该方案直接消除表2中CaseID的重复行,确保表1每行仅匹配一行数据,完美贴合预期结果。
方案二:按行号一一对应关联(适用于同CaseID存在不同CreatedDate的场景)
如果后续表2中同一CaseID可能出现不同CreatedDate,需要让表1和表2的同CaseID行按顺序一一匹配,可使用窗口函数生成行号后关联:
WITH Table1_Ranked AS ( SELECT Id, Name, CaseID, ROW_NUMBER() OVER (PARTITION BY CaseID ORDER BY Id) AS rn FROM table1 ), Table2_Ranked AS ( SELECT CaseID, CreatedDate, ROW_NUMBER() OVER (PARTITION BY CaseID ORDER BY T2Id) AS rn FROM table2 ) SELECT t1.Id, t1.Name, t1.CaseID, t2.CreatedDate FROM Table1_Ranked t1 LEFT JOIN Table2_Ranked t2 ON t1.CaseID = t2.CaseID AND t1.rn = t2.rn;
此方法通过PARTITION BY CaseID分组,ROW_NUMBER()生成组内行号,确保表1和表2的同组行按顺序一一对应,避免笛卡尔积。
内容的提问来源于stack exchange,提问作者Anil Kumar
相关产品推荐
相关产品推荐

