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

同表JOIN并忽略NULL值:合并同组数据的SQL实现问询

解决同表合并分组内非NULL字段的问题

咱们先明确你的核心需求:把hadap_game表中,同一userid、game、date_t、hdigit分组下的inside和outside字段合并,保留两个字段的非NULL值,去掉重复分组里的冗余行(比如前两行的xy游戏分组)。

方案一:用聚合函数分组合并(推荐)

这种方式不需要自连接,直接通过GROUP BY结合聚合函数提取每个分组里的非NULL值,性能更优:

SELECT 
    MIN(id) AS id,  -- 取分组内最小的id,匹配你期望的结果id
    userid,
    game,
    date_t,
    hdigit,
    MAX(inside) AS inside,  -- 提取分组内非NULL的inside值
    MAX(outside) AS outside -- 提取分组内非NULL的outside值
FROM hadap_game
WHERE userid = :user  -- 你的用户参数条件
GROUP BY userid, game, date_t, hdigit
ORDER BY id;

为什么这个方案有效?

因为你的数据里,同一分组内inside和outside各自只会有一个非NULL值(另一个是NULL),MAX()函数会自动忽略NULL,只保留有效数值。对于hdigit不同的分组(比如xx游戏的hdigit=2和3),因为分组条件不同,会各自保留独立行,正好符合你的期望结果。

方案二:修正自连接写法

如果你坚持要用自连接,需要补充完整的连接条件,确保只关联同一分组的行,同时过滤掉无效的NULL匹配:

SELECT 
    h.id,
    h.userid,
    h.game,
    h.date_t,
    h.hdigit,
    h.inside,
    COALESCE(h.outside, htwo.outside) AS outside
FROM hadap_game AS h
LEFT JOIN hadap_game AS htwo 
    ON h.userid = htwo.userid
    AND h.game = htwo.game
    AND h.date_t = htwo.date_t
    AND h.hdigit = htwo.hdigit
    AND h.inside IS NOT NULL
    AND htwo.outside IS NOT NULL
WHERE h.userid = :user
GROUP BY h.id, h.userid, h.game, h.date_t, h.hdigit, h.inside, htwo.outside;

你原来的SQL问题点

你之前的自连接只写了部分条件,没有用ON指定分组关联的核心字段(game、date_t、hdigit),这会导致错误的交叉连接,无法正确匹配同一分组的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:04