【问题标题】:SQL: Join two tables, take all row and set default valueSQL:连接两个表,取所有行并设置默认值
【发布时间】:2018-10-23 07:55:37
【问题描述】:

我是 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

这是我的第二张桌子:

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

第二个表有 6 行。

所以,如果我只是使用内连接、外连接等方式连接表#1 中的 5 行和表 #2 中的 6 行,它只会返回 5 行。

如何加入才能返回所有行并将缺失值的默认值设置为零? (我也不知道哪个表有更多的行。它会不时改变,我不能做左、右连接)。

【问题讨论】:

  • 建议:在加入表格时不需要内部select:删除from 子句中的select * from table 将大大简化您的代码。

标签: sql


【解决方案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;

注意事项:

  • 查询的结果不是“表”,它们是一个结果集,可以在另一个查询中用作子查询。
  • 使用与表名相关的表别名。这样可以更轻松地跟踪查询。
  • 您希望沿两个不同的维度(媒体和 cmets)聚合。您需要单独聚合以避免笛卡尔积)。
  • 要避免使用NULL 值,请使用coalesce()
  • 不要使用(select * from . . . ) 子查询。这些只是更难写和读。在某些数据库中,它们会影响性能。

【讨论】:

  • 非常感谢您的解释。我会注意的。运行您的代码时出现错误。错误:缺少表“m”的 FROM 子句条目我该怎么办?
【解决方案2】:

使用 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

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2018-03-28
    • 2017-08-30
    • 2011-10-15
    相关资源
    最近更新 更多