当前位置: 首页 > 知识库问答 >
问题:

SQL:连接两个表,获取所有行并设置默认值

吉玉石
2023-03-14

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

我如何加入,以便它将返回所有行,并为缺少的值设置默认值为零?(我也不知道哪个表的行数更多。它可能会时不时地改变,我无法进行左、右连接)。

共有2个答案

韩朝斑
2023-03-14

使用left join and 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
柴英博
2023-03-14

我想你想要:

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()
  • 不要使用(选择*from…) 子查询。这些只是更难写和读。在某些数据库中,它们可能会影响性能

 类似资料:
  • 问题内容: 我有两个实体类Category和Events。我需要连接两个表并获取与给定条件匹配的所有记录 我的SQL查询 我怎样才能将此SQL查询转换为hql并获取数据? 我在下面尝试了但没有得到结果?hibernate很新 用于hibernate映射的事件实体类 类别实体 提取类别方法 问题答案: 使用ORM工具时,您需要考虑Java对象。 根据您的问题,我认为您要编写的查询看起来像: 使用OR

  • 问题内容: 好的,我试图查看每个供应商提供了多少个产品(“产品”和“供应商”为单独的表格)。我希望将结果与公司名称和公司提供的产品数量一起显示。我不确定该如何设置。 到目前为止,我有: 我不确定如何使每个公司的ProductName计数。如果您能为我提供任何帮助,我将不胜感激。 问题答案: 您所缺少的只是GROUP BY子句: 使用LEFT {OUTER} JOIN意味着如果某些供应商不提供任何产

  • 我需要连接来自两个不同表的数据,如下所示。仅使用一个sql查询就可以做到这一点吗?如果“key”和“name”在两个表上,那么它们是相同的。表1中的“状态”始终为“-”,表2中的“T”。此外,两个表上的“名称”和“comp”都匹配(例如:Name3-C和Name4-B)<我尝试过“联合”和“加入”,但还没有解决办法! 表1 表2 结果应该是。。。 提前谢谢!

  • 问题内容: 我有具有相同结构的不同表,我想通过它们的一列将它们连接起来。 问题在于他们不共享该列中的信息。 结果表: (在单列中) 到目前为止,我已经尝试过: 我知道我的查询是错误的,因为我要调用更多我想要的列,但是我不确定如何将所有列合并到一个列中。我该怎么做? 问题答案: 你有没有尝试过? 如果您不想排除重复的值,则可能要使用。 要限制结果集,您可以执行以下操作:

  • 问题内容: 我执行选择以获取表的结构。我想获取有关列的信息,例如其名称,是否为null或是否为主键。 但是对于默认值,我得到的是id ..类似454545454的东西,但是我想得到的值是“ xxxx”。要搜索的表是什么,或者将该ID转换为值的函数是什么。谢谢 问题答案: 您可以执行此操作(只需执行SELECT *,这样您就可以看到所有可用信息): 结果集中包括“ COLUMN_DEFAULT”列。

  • 问题内容: 我有一个模型如下: 我也有上述模型的模型形式,如下所示: 我想知道如何为该坦克隐藏字段设置默认值。这是我到目前为止显示/保存表格的功能: 问题答案: 你有两个选择,可以在调用表单构造函数时填充值: 或在表单定义中设置值: