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

多表左连接时如何获取唯一Dest.Code值?DISTINCT失效问题求助

解决Dest.Code重复值的问题

嘿,我明白你的问题了——你想拿到每个Dest.Code的唯一记录,但原来的DISTINCT不管用,对吧?这是因为DISTINCT是对整行去重,而你的重复Code对应的CityName和Country.Id不一样,所以整行其实都是唯一的,DISTINCT自然没法帮你过滤掉重复的Code。

下面给你几个实用的解决方案,你可以根据自己用的数据库类型选择:

方案1:窗口函数ROW_NUMBER()(通用大多数数据库)

这是最通用的方法,几乎所有主流数据库(MySQL 8+、PostgreSQL、SQL Server等)都支持。我们用窗口函数给每个相同Code的组编号,然后只取每组的第一行:

SELECT Code, CityName, Id
FROM (
    SELECT 
        Dest.Code,
        City.CityName,
        Country.Id,
        -- 按Code分组,给每组行编号,ORDER BY (SELECT NULL)表示随机取第一行
        ROW_NUMBER() OVER (PARTITION BY Dest.Code ORDER BY (SELECT NULL)) AS rn
    FROM base.Dest 
    LEFT JOIN base.City ON base.Dest.CityId = base.City.Id 
    LEFT JOIN base.Country ON base.City.CountryId = base.Country.Id
) AS sub_query
WHERE rn = 1;

方案2:GROUP BY + ANY_VALUE()(MySQL专属)

如果用的是MySQL,可以直接用GROUP BY分组,再用ANY_VALUE()函数取每组内的任意值,正好符合你“随便保留哪条”的需求:

SELECT 
    Dest.Code,
    ANY_VALUE(City.CityName) AS CityName,
    ANY_VALUE(Country.Id) AS Id
FROM base.Dest 
LEFT JOIN base.City ON base.Dest.CityId = base.City.Id 
LEFT JOIN base.Country ON base.City.CountryId = base.Country.Id
GROUP BY Dest.Code;

方案3:DISTINCT ON(PostgreSQL专属)

PostgreSQL有个专门的DISTINCT ON语法,可以直接指定按某个字段去重,保留该字段第一次出现的行:

SELECT DISTINCT ON (Dest.Code)
    Dest.Code,
    City.CityName,
    Country.Id
FROM base.Dest 
LEFT JOIN base.City ON base.Dest.CityId = base.City.Id 
LEFT JOIN base.Country ON base.City.CountryId = base.Country.Id
-- 必须按DISTINCT ON指定的字段排序,这里只按Code排,随机取第一行
ORDER BY Dest.Code;

这样处理后,每个Dest.Code只会出现一次,不管对应的其他字段取的是哪条记录~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:59:34