【问题标题】:Postgres SQL gathering data from two tables using an id from a 3rd tablePostgresql 使用第三个表中的 id 从两个表中收集数据
【发布时间】:2022-12-18 18:57:05
【问题描述】:

我有 3 张桌子;

  • idmaster
  • 数据1
  • 数据2

idmaster 拥有所有 ID。我需要计算每个 id 在 data1 和 data2 中存在的次数并将它们分开输出。

id来自idmaster。理想情况下希望拥有所有这些,即使不存在数据,但这并不重要。 data1data2 确实有 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
      

      【讨论】:

        猜你喜欢
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多