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

左连接计数干扰左连接和

申屠宏胜
2023-03-14

当我添加一个左连接来获取外部表的计数时,它将我其他左连接表的总和值与计数相乘,我也不能在这里使用不同的总和,因为两个值可以是相同的:

SELECT c.id as company_id, SUM(ct.amount) as total_billed, count(l.id) as load_count
FROM tbl_companies c
LEFT JOIN tbl_company_transactions ct ON c.id = ct.company_id
LEFT JOIN tbl_loads l ON c.id = l.company_id
GROUP BY c.id;

共有3个答案

董意蕴
2023-03-14

Gordon的答案更具可扩展性,但对于这个特定的查询,您只需要一个子查询,这也可能提供性能提升,因为预聚合数据上的连接可能无法使用索引

SELECT c.id as company_id, SUM(ct.amount) as total_billed, l.load_count
FROM tbl_companies c
    LEFT JOIN tbl_company_transactions ct ON c.id = ct.company_id
    LEFT JOIN (
        SELECT company_id, count(*) as load_count
        FROM tbl_loads
        GROUP BY company_id
    ) l ON c.id = l.company_id
GROUP BY c.id;

重要的一点是,如果您需要集合函数的结果,如SUM()COUNT(),那么当您使用多行执行多个连接时,您需要小心。

袁恩
2023-03-14

您可以隔离聚合统计信息,然后连接结果。

WITH 
tranStats AS (
    SELECT company_id, SUM(amount) AS total_billed
    FROM tbl_company_transactions
    GROUP BY company_id
),
loadStats AS (
    SELECT company_id, COUNT(1) AS load_count
    FROM tbl_loads
    GROUP BY company_id
)
SELECT id, total_billed, load_count
FROM tbl_companies c
LEFT JOIN tranStats t ON t.company_id = c.id
LEFT JOIN loadStats l ON l.company_id = c.id
毋弘光
2023-03-14

您需要预先聚合数据:

SELECT c.id as company_id, ct.total_billed,  
       l.load_count
FROM tbl_companies c LEFT JOIN
     (SELECT ct.company_id, SUM(ct.amount) as total_billed
      FROM tbl_company_transactions ct
      GROUP BY ct.company_id
     ) ct
     ON c.id = ct.company_id LEFT JOIN
     (SELECT l.company_id, COUNT(*) as load_count
      FROM tbl_loads l
      GROUP BY l.company_id
     ) l
     ON c.id = l.company_id;

正如您所观察到的,JOIN会增加行数并影响聚合。

 类似资料:
  • 主要内容:Oracle LEFT JOIN子句简介,Oracle LEFT JOIN示例在本教程中,您将学习如何使用Oracle 子句来查询多个表中的数据。 Oracle LEFT JOIN子句简介 以下语句说明连接两个表和时的子句的语法: 在这个查询中,是左表,是右表。查询将表中的每一行与表中的行进行比较。如果和表中的一对行满足连接谓词,查询将组合两个表中行的列值,并将结果行记录包含在结果集中。 如果表中的行在表中没有找到匹配的行,则查询将会将SELECT子句中出现在表的每个列的值

  • LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F

  • 本文向大家介绍说下左连接和右连接相关面试题,主要包含被问及说下左连接和右连接时的应答技巧和注意事项,需要的朋友参考一下 比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。 右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替

  • MariaDB 用于返回条件中指定的左侧表中的所有行,并仅返回满足连接条件的其他表中的行。 也被称为。 语法: 图形表示如下: 注: 上图中,两个图形的左侧表(table1)和右侧表(table2)中间交叉蓝色部分,以及左侧表(table1)就是连接返回的结果集。 为了方便演示,我们需要创建两个表,并插入一些数据 - 插入数据 - 当前表中的行记录如下 - 当前表中的行记录如下 - 示例1 使用以

  • 问题内容: 我有一个Hibernate的服务方法,例如:。securityId2由用户传递。每个SecurityContact与一个Contact有多对一的关系,因此Hibernate在运行此查询时会自动调用联接。但是,Hibernate始终运行的联接是内部联接,因此无法正常运行。有没有办法强迫Hibernate在内部生成左外部联接?这是SecurityContact类的代码: 问题答案: 尝试多

  • 本文向大家介绍简单谈谈mysql左连接内连接,包括了简单谈谈mysql左连接内连接的使用技巧和注意事项,需要的朋友参考一下 前言 最近忙着开发x省冷链追溯系统,天天干到晚上十一点多才回到家,周末也加班,没啥时间写博客,闲下来再好好写写 业务: sql语句统计出入库数据。 问题: 只统计了X端入库单。 原因: 没有发现X端的数据库中只有入库单是有a字段数据而出库单是没有的,并使用了a字段去inner