hive&sql-LEFT JOIN之后,数据量为啥比左表还要少

重现

a表 LEFT JOIN B表,结果表的数据量正常应该是=a表或者>a表(数据翻倍)。但有种情况,结果表会比a表少。

select

a.XX,

...,

b.XX

from  a

left join b

on a.id=b.id

where a.data_date=20210323 and b.data_date=20210323

逻辑很简单,就是用两个表的data_date做关联,但是结果却比 a 表的数据少了。当把唯一一个 “where” 换成 “and” 后,结果便正确了。这个原因其实是过滤数据的对象不同。
下面用 MySQL 创建示例来进行说明,

准备数据:分别创建两个表 emp和dept:

create table emp(

id int not null AUTO_INCREMENT PRIMARY KEY comment '员工编号',

name varchar(10) not null default '' comment '姓名',

dept_id int not null default 0 comment '所在部门编号'

) comment '员⼯表';

create table dept(

dept_id int not null AUTO_INCREMENT PRIMARY KEY comment '部门编号',

dept_name varchar(10) not null default '' comment '部门名称'

) comment '部门表';

insert into emp values (1,'张三',2),(2,'李四',2),(3,'王五',3),(4,'赵六',0),(5,'旺财',0);

insert into dept values (1,'财务部'),(2,'销售部'),(3,'研发部'),(4,'后勤部');

只用on,是我们想要的

select a.*,b.* from emp a left join dept b
on a.dept_id =b.dept_id

hive&sql-LEFT JOIN之后,数据量为啥比左表还要少

如果加上 and a.dept_id = 2 ,结果也是我们想要的,如下:

select a.*,b.* from emp a left join dept b
on a.dept_id = b.dept_id and a.dept_id = 2

hive&sql-LEFT JOIN之后,数据量为啥比左表还要少
结果还是以左表为准,只是右边只有 dept_id = 2 的数据。
所以,LEFT JOIN时,无论ON的条件如何,左表不会被过滤,只会过滤右表。ON仅仅是连接的条件,但不是过滤条件,只是规定了什么样的数据需要连接==》 左表数据全部保留的情况下,需要保留哪些符合条件的右表数据

当把 and a.dept_id = 2 替换成 where a.dept_id = 2 ,结果就不正常了,如下:

select a.*,b.* from emp a left join dept b
on a.dept_id = b.dept_id
where a.dept_id = 2

hive&sql-LEFT JOIN之后,数据量为啥比左表还要少
此时结果就比左表数据要少了。

summary

造成这种现象的原因是:数据库在通过两个表或者多个表返回数据时,都会生成一个中间的临时表, on后面的过滤条件是在生成临时表时进行过滤的,无论 on 条件的是否为真 ,都会返回左表的全部(以 left join 为例),如果右表无法匹配则补空。而 where 后面的过滤条件是在生成临时表之后进行过滤的,只有 where 过滤条件为真的数据才会返回。

也就是说,跟关联键有关的过滤条件,都要放在on中。

  • 通过 on 过滤的原理如下:
    hive&sql-LEFT JOIN之后,数据量为啥比左表还要少
    hive&sql-LEFT JOIN之后,数据量为啥比左表还要少
    所以要么在子查询中对b表进行where,或者在on后面写

Original: https://blog.csdn.net/qq_34224565/article/details/125760805
Author: zdkdchao
Title: hive&sql-LEFT JOIN之后,数据量为啥比左表还要少

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/818246/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Android常见的存储方式

    Android系统一共提供了四种数据的存储方式。分别是: SharePreference、SQLite、ContentProvider、File。 SharedPreference…

    大数据 2023年11月10日
    038
  • 完美解决VMware安装后没有VMnet1和VMnet8的问题

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 1. 问题描述 计算机上成功安装VMware虚拟机后,安装Ubuntu系统。Ubuntu系统无法联网,多方检查发现问题:宿主机的…

    大数据 2023年5月27日
    095
  • alpakka-kafka(9)-kafka在分布式运算中的应用

    kafka具备的分布式、高吞吐、高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费。特别是exactly-o…

    大数据 2023年5月28日
    079
  • 使用Hive SQL查询Iceberg表的正确姿势

    本文首发微信公众号:码上观世界 Iceberg作为一种表格式管理规范,其数据分为元数据和表数据。元数据和表数据独立存储,元数据目前支持存储在本地文件系统、HMS、Hadoop、JD…

    大数据 2023年11月12日
    034
  • Kafka、zookeeper启动脚本

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/ywjfx/p/16090136.htmlAuthor:…

    大数据 2023年5月28日
    080
  • 很详细的nginx配置HTTPS

    闲来无事,尝试一下HTTPS。 正好华为云有活动,域名10块钱一年,证书免费。 参考:https://www.bbsmax.com/A/B0zqr3wnJv/ 域名绑定&申…

    大数据 2023年5月27日
    067
  • Tapdata 与麒麟软件完成兼容性互认证,国产化生态布局再跃步

    近日, Tapdata 实时数据平台(Tapdata Live Data Platform, Tapdata LDP)与麒麟软件完成产品兼容互认证。经深圳钛铂数据有限公司和麒麟软件…

    大数据 2023年6月3日
    077
  • Dockerfile 指令 VOLUME 介绍(转)

    1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或…

    大数据 2023年5月28日
    063
  • ADB命令

    ADB介绍 ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理 android模拟器或者真实的andriod设…

    大数据 2023年11月11日
    033
  • Docker容器化引擎

    摘自《Java微服务分布式架构企业实战》 如今Docker在一线互联网公司的应用已经非常普遍,使用Docker技术可以给企业带来极大的好处,使企业的业务水平扩展更快速,从而到达弹性…

    大数据 2023年5月29日
    080
  • Hive 分桶

    一.hive 分桶概述 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。 对于 hive 中每一个表、分区都可以进一步进行分桶。 由列的哈希值除以桶的个数来决定每条数据…

    大数据 2023年5月25日
    069
  • HIVE自定义UDAF函数

    GenericUDAFEvaluator的方法: 文章目录 * – GenericUDAFEvaluator的方法: – + 一、介绍 + 二、UDAF编写…

    大数据 2023年11月12日
    046
  • 单机部署hive(hive+hadoop)

    基础准备 系统准备 * soft noproc 1024000 * hard noproc 1024000 * soft nofile 1024000 * hard nofile …

    大数据 2023年11月13日
    038
  • 一起来学自然语言处理—-加工原料文本

    加工原料文本 从网络和硬盘访问文本 * 1.电子书 2.处理的HTML 3.读取本地文件 4.NLP的流程 字符串:字符串的基本操作 使用Unicode进行文字处理 * 1. 从文…

    大数据 2023年5月28日
    0112
  • Java实现两种队列(数组和链表)

    @date 2022-09-13 17:50*/public class QueueLinked{ private static class Node{E item;Node ne…

    大数据 2023年6月2日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球