首页 > 解决方案 > 在 LEFT JOIN 中添加限制会导致返回不正确的限制金额

问题描述

我目前正在我的 Postgres 数据库中处理一个查询,并且遇到了我添加到左连接的限制。这是我的查询:

SELECT
    t.id AS "teamId",
    t.name,
    COALESCE(NULLIF(json_agg(Games.games)::TEXT, '[null]'), null)::JSON AS "games"
FROM teams t
    LEFT JOIN (
        SELECT
            tg.team_id,
            jsonb_build_object(
                'id', tg.id
            ) AS games
        FROM tournament_games tg
        ORDER BY tg.total_points DESC
        LIMIT 4
   )AS Games ON Games.team_id = t.id
WHERE t.tournament_id = 40
GROUP BY t.id

我遇到的问题LIMIT 4是只返回 3 个游戏而不是 4 个。当我删除限制时,我的数据库中收到了所有 6 个游戏。

在左连接中应用限制是否有问题?每次我增加限制时,它都会比限制状态少一个。(EX. 限制 5 返回 4 场比赛)

编辑:

删除限制时,它会返回我数据库中的所有 6 个条目。如果将限制设置为 7(超过总条目),则仅返回 4 个条目。

这是否意味着 LEFT JOIN 中的查询返回 7 但实际的 JOIN 正在删除其他查询?

标签: sqljsonpostgresqlleft-joinlateral-join

解决方案


我怀疑你想要每队4 场比赛。为此,我建议使用子查询或横向连接:

select t.id as teamid, t.name, tg.games
from teams t
left join lateral (
    select jsonb_agg(jsonb_build_object('id', tg.id)) as games
    from (
        select tg.*
        from tournament_games tg
        where tg.team_id = t.id
        order by tg.total_points desc
        limit 4
    ) tg
) tg on true
where t.tournament_id = 40

我不确定您为什么要将 json 对象转换为文本 - 这似乎并没有真正的帮助,所以我把它分开了。


推荐阅读