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
相关产品推荐
相关产品推荐

