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

如何避免SQL中的笛卡尔积?多列关联结果重复问题求助

解决左连接后出现重复行的问题

问题根源

T2中存在重复的(Col1, Col2, Col3)组合,当T1与T2基于这三列做左连接时,T1的每一行会匹配T2中所有符合条件的行,因此原本2行的T1会生成2*2=4行重复结果。

解决方案

核心思路是先对T2的关联列去重,再与T1执行左连接,以下是几种可行的写法:

方式1:用DISTINCT对T2去重

SELECT t1.*
FROM T1
LEFT JOIN (
    SELECT DISTINCT Col1, Col2, Col3
    FROM T2
) t2_unique 
    ON t1.Col1 = t2_unique.Col1 
    AND t1.Col2 = t2_unique.Col2 
    AND t1.Col3 = t2_unique.Col3;

方式2:用GROUP BY对T2去重

SELECT t1.*
FROM T1
LEFT JOIN (
    SELECT Col1, Col2, Col3
    FROM T2
    GROUP BY Col1, Col2, Col3
) t2_unique 
    ON t1.Col1 = t2_unique.Col1 
    AND t1.Col2 = t2_unique.Col2 
    AND t1.Col3 = t2_unique.Col3;

方式3:用ROW_NUMBER()筛选唯一行

如果之前尝试过窗口函数但未成功,可能是分区或排序逻辑有误。以下是正确的写法:

SELECT t1.*
FROM T1
LEFT JOIN (
    SELECT Col1, Col2, Col3,
           ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3 ORDER BY (SELECT NULL)) AS rn
    FROM T2
) t2_unique 
    ON t1.Col1 = t2_unique.Col1 
    AND t1.Col2 = t2_unique.Col2 
    AND t1.Col3 = t2_unique.Col3
    AND t2_unique.rn = 1;

这里通过PARTITION BY按关联列分组,每组只保留第一行(rn=1),避免重复匹配。

内容的提问来源于stack exchange,提问作者unicorn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:01:07