SQL Select 来自多个表并计算第三个
SQL Select from multiple tables and count third
我想计算 table 中被其他 table 的两个字段引用的行数。
我有以下结构
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;
我错过了什么?
你很接近。您查询的主要问题:
您正在混合使用隐式连接和显式连接:只是不要这样做。首先评估显式连接,导致您收到错误(隐式连接 table 尚未确定)
你想要 right join
,而不是 left join
; right 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
生成 branches
和 levels
的所有可能组合来实现的(这基本上是两个 table 的笛卡尔积),然后带来repos
table 和 left join
。剩下的就是聚合和计算有多少 repos
记录匹配每个 branch/level 组合。
我想计算 table 中被其他 table 的两个字段引用的行数。
我有以下结构
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;
我错过了什么?
你很接近。您查询的主要问题:
您正在混合使用隐式连接和显式连接:只是不要这样做。首先评估显式连接,导致您收到错误(隐式连接 table 尚未确定)
你想要
right join
,而不是left join
;right 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
生成 branches
和 levels
的所有可能组合来实现的(这基本上是两个 table 的笛卡尔积),然后带来repos
table 和 left join
。剩下的就是聚合和计算有多少 repos
记录匹配每个 branch/level 组合。