首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“左联接”中添加限制将导致返回不正确的限值。

在“左联接”中添加限制将导致返回不正确的限值。
EN

Stack Overflow用户
提问于 2020-12-04 21:05:02
回答 1查看 75关注 0票数 0

目前,我正在处理Postgres数据库中的查询,并限制了添加到左联接的限制。以下是我的疑问:

代码语言:javascript
复制
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场比赛。

在左联接中应用限制有问题吗?每次我增加极限,它的返回比极限状态少一个。(前。极限5返回4局)

编辑:

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

这是否意味着左侧联接中的查询将返回7,但实际的联接将移除其他连接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-04 21:33:46

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

代码语言:javascript
复制
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对象转换为文本--这似乎没有多大帮助,所以我将其置之不理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65150728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档