【问题标题】:Postgres SQL gathering data from two tables using an id from a 3rd tablePostgresql 使用第三个表中的 id 从两个表中收集数据
【发布时间】:2022-12-18 18:57:05
【问题描述】:
我有 3 张桌子;
idmaster 拥有所有 ID。我需要计算每个 id 在 data1 和 data2 中存在的次数并将它们分开输出。
id来自idmaster。理想情况下希望拥有所有这些,即使不存在数据,但这并不重要。
data1 和data2 确实有 id 列。
例子
| id |
data1 cnt |
data2 cnt |
| A |
104 |
20 |
| B |
12 |
4 |
| C |
0 |
0 |
我试过了,但它给了我一些无意义的数字,data1 和 data2 的数字完全相同,与我的数据不匹配。
SELECT idmaster.id, count(data1.*), count(data2.*) FROM idmaster, data1, data2
WHERE idmaster.id = public.data1.id
AND idmaster.id = public.data2.id
GROUP BY idmaster.id
结果:
| id |
data1 cnt |
data2 cnt |
| A |
160 |
160 |
| B |
66 |
66 |
| C |
7 |
7 |
我期待这样的事情:
例子
| id |
data1 cnt |
data2 cnt |
| A |
104 |
20 |
| B |
12 |
4 |
| C |
0 |
0 |
【问题讨论】:
标签:
sql
postgresql
multiple-tables
【解决方案1】:
您可以使用 left join 在 data1、data2 表中分别查找 id 的计数,然后加入这两个单独的查询以获得所需的输出。
with data1_counts as
(
select M.id, count(D1.id) data1_cnt from
idmaster M left join data1 D1
on M.id=D1.id
group by M.id
),
data2_counts as
(
select M.id, count(D2.id) data2_cnt from
idmaster M left join data2 D2
on M.id=D2.id
group by M.id
)
select dt1.id, dt1.data1_cnt, dt2.data2_cnt
from data1_counts dt1 join data2_counts dt2
on dt1.id=dt2.id
order by dt1.id
见demo。
【解决方案2】:
您可以使用两个“标量子查询”(下面的第 2 行和第 3 行)来计算相关行的计数。例如:
select id,
(select count(*) from data1 d where d.id = m.id) as data1_cnt,
(select count(*) from data2 d where d.id = m.id) as data2_cnt
from idmaster m