【问题标题】:SQL Select from multiple tables and count thirdSQL 从多个表中选择并计算第三个
【发布时间】:2020-04-07 22:17:27
【问题描述】:

我想计算表中被其他表的两个字段引用的行数。

我有以下结构

branches table
id, name
1, dev
2, master

levels table
id, name
1, easy
2, hard

repos table
id, name, branch_id, level_id
1, repo-1, 1, 1
2, repo-2, 2, 2

我想要达到的结果

b_id, l_id, r_cnt
1, 1, 1
1, 2, 0
2, 1, 0
2, 2, 1

我尝试过的语句,但在右连接时出错

SELECT
    b.id,
    l.id,
    COUNT(r)
FROM
    branches b,
    levels l
    RIGHT OUTER JOIN repos r ON r.branch_id = b.id
    AND r.level_id = l.id;

我错过了什么?

【问题讨论】:

    标签: sql postgresql join outer-join


    【解决方案1】:

    你很接近。您查询的主要问题:

    • 您正在混合隐式和显式连接:不要。首先评估显式连接,导致您得到的错误(尚未识别隐式连接表)

    • 你想要right join,而不是left joinright join 非常违反直觉,我建议一般避免使用它们

    考虑:

    select b.id b_id, l.id l_id, count(r.id)
    from branches b
    cross join levels l
    left join repos r on r.branch_id = b.id and r.level_id = l.id
    group by b.id, l.id
    

    这通过使用cross join(这基本上是两个表的笛卡尔积)生成brancheslevels 的所有可能组合,然后将repos 表与left join 结合起来。剩下的就是聚合并计算有多少 repos 记录与每个分支/级别组合匹配。

    【讨论】:

    • 谢谢!将计数转换为布尔值的最佳方法是什么? count(r.id)::int::boolean 不是代码味道吗?
    • 欢迎@EvgeniyPetrov。 count(*)::boolean 应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多