SQL:联接两个表,占据所有行并设置默认值

时间:2018-10-23 07:55:37

标签: sql

我是SQL的新手,我不知道当前要搜索的正确单词。

我有一个这样的第一个表-它有5行。

SELECT 
    tFinal2.region, COUNT(newsfeed_id) AS comment 
FROM
    (SELECT *  
     FROM
         ((SELECT *
           FROM public.newsfeed_comment) AS T1
          INNER JOIN
              (SELECT * FROM public.newsfeed) AS T2 ON T1.newsfeed_id = T2.seq) AS tFinal1) AS tFinal2
GROUP BY 
    tFinal2.region

enter image description here

这是我的第二张桌子:

SELECT tFinal2.region, COUNT(newsfeed_id) AS media 
FROM
    (SELECT *
     FROM
         ((SELECT *
           FROM public.newsfeed_media) AS T1
          INNER JOIN
          (SELECT * FROM public.newsfeed) AS T2 T1.newsfeed_id = T2.seq) AS tFinal1) AS tFinal2
GROUP BY 
    tFinal2.region

enter image description here

第二个表有6行。

因此,如果我仅使用内部联接,外部联接等将表#1的5行和表#2的6行联接起来,它将仅返回5行。

我如何加入,以便它将返回所有行并将缺失值的默认值设置为零? (我也不知道哪个表有更多行。它可以不时更改,并且无法左右合并)。

2 个答案:

答案 0 :(得分:1)

我想你想要

select nf.region, coalesce(sum(num_comments), 0) as num_comments,
       coalesce(sum(num_media), 0) as num_media
from public.newsfeed nf left join
     (select c.newsfeed_id, count(*) as num_comments
      from public.newsfeed_comment c
      group by c.newsfeed_id
     ) c
     on nf.seq = c.newsfeed_id left join
     (select m.newsfeed_id, count(*) as num_media
      from public.newsfeed_media m
      group by m.newsfeed_id
     ) m
     on nf.seq = m.newsfeed_id
group by nf.region;

注意:

  • 查询的结果不是“表”,而是一个结果集,可以在另一个查询中将其用作子查询。
  • 使用与表名称相关的表别名。这样可以更轻松地跟踪查询。
  • 您要沿两个不同维度进行汇总(媒体和评论)。您需要单独汇总以避免使用笛卡尔积)。
  • 要避免使用NULL值,请使用coalesce()
  • 请勿使用(select * from . . . )子查询。这些都很难编写和阅读。在某些数据库中,它们会影响性能。

答案 1 :(得分:0)

使用left join和coalesce()函数将缺失值替换为0

select tFinal2.region, coalesce(count(newsfeed_id),0) as comment from (
    select * from (
    (SELECT *
    FROM public.newsfeed_comment) as T1
    left join 
    (SELECT * from public.newsfeed) as T2
    on T1.newsfeed_id = T2.seq) as tFinal1
    ) as tFinal2
    group by tFinal2.region