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

SQL自连接结果去重问题:如何修正返回重复值的查询?

修正SQL查询以获取预期的配对结果

你的问题在于当前查询用了隐式交叉连接(逗号分隔两个表),这会让m1里的每个ID和m2里的每个ID都配对一次,所以会返回9行(3×3)不同的组合,DISTINCT在这里根本没用——因为所有组合本身都是唯一的,但不是你想要的一一对应关系。

要得到你期望的1→2、4→5、9→10的配对结果,有几种可行的方案:

方案1:用窗口函数按顺序配对(通用灵活)

如果你的数据库支持ROW_NUMBER()这类窗口函数(比如PostgreSQL、MySQL 8+、SQL Server等),可以给两个子集的行编号,再按编号关联:

WITH cte_m1 AS (
    SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS row_num
    FROM Mois
    WHERE ID IN ('1','4','9')
),
cte_m2 AS (
    SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS row_num
    FROM Mois
    WHERE ID IN ('2','5','10')
)
SELECT cte_m1.ID AS C1, cte_m2.ID AS C2
FROM cte_m1
INNER JOIN cte_m2 ON cte_m1.row_num = cte_m2.row_num;

⚠️ 注意:ORDER BY ID要保证两个子集的排序和你期望的配对顺序一致——比如这里1,4,9升序对应2,5,10升序,刚好匹配你要的结果。如果配对顺序不是按ID升序,你需要调整ORDER BY的字段或逻辑。

方案2:直接指定固定配对关系(简单直接)

如果你的配对关系是固定不变的(就是1必须对应2,4对应5,9对应10),可以用CASE语句或者直接在JOIN里写关联条件:

用CASE语句:

SELECT 
    m1.ID AS C1,
    CASE m1.ID
        WHEN '1' THEN '2'
        WHEN '4' THEN '5'
        WHEN '9' THEN '10'
    END AS C2
FROM Mois m1
WHERE m1.ID IN ('1','4','9');

用JOIN指定关联条件:

SELECT m1.ID AS C1, m2.ID AS C2
FROM Mois m1
INNER JOIN Mois m2 ON 
    (m1.ID = '1' AND m2.ID = '2')
    OR (m1.ID = '4' AND m2.ID = '5')
    OR (m1.ID = '9' AND m2.ID = '10');

这两种方案都能精准得到你要的3行配对结果,选哪种取决于你的配对关系是否会变化——如果以后要加更多配对,方案1更灵活;如果配对固定不变,方案2更简单直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:30:04