目录

0. 其他

1. 问题描述

2. 问题复现

2.1. 建表语句

2.2. 插入数据

2.3. 查询SQL以及问题

3. 问题原因

4. 问题解决


0. 相关文章链接

开发随笔文章汇总

1. 问题描述

在Hive中(其他类似SQL,比如PostgreSQL可能也存在此问题),当对多张表(3张及以上)进行full join时,会存在每张表的主键都是唯一,但当full join后,会发现主键可能有重复。

2. 问题复现

2.1. 建表语句

create table realtime_dw.table_a
(id int,name int
);create table realtime_dw.table_b
(id int,name int
);create table realtime_dw.table_c
(id int,name int
);

2.2. 插入数据

-- a表      -- b表      -- c表
1,111       1,111       1,111
2,222       3,333       4,444
3,333       4,444       5,555

2.3. 查询SQL以及问题

selectcoalesce(a.id, b.id, c.id) as id, a.name, b.name, c.name
from table_a as afull join table_b as b
on a.id = b.idfull join table_c as c
on a.id = c.id
;

当执行如上查询SQL时,会发现其中 id = 4 的数据有重复,如下图所示:

3. 问题原因

之所以会出现这样的问题,是因为是以a表为主表,但a表中只有 id 为 1、2、3 的数据,但在b表中有id为4,c表中也有id为4,此时full join时,a表会以空值和b表、c表中id为4的数据join,这样关联后的表中就会出现2条id为4的数据。

4. 问题解决

在后续的表full join时,不单单使用第一张表的主键full join(因为是full join,所以肯定会存在第一张表为null,而其他表有值的数据),而使用 coalesce 方法对所有前面已经full join了的主键进行条件关联,如下代码:

selectcoalesce(a.id, b.id, c.id) as id, a.name, b.name, c.name
from table_a as afull join table_b as b
on a.id = b.idfull join table_c as c
on coalesce(a.id, b.id) = c.id
;

此时,结果就不会有主键重复,如下查询结果所示:


注:其他相关文章链接由此进 ->      开发随笔文章汇总


hive中多表full join主键重复问题相关推荐

  1. 数仓工具—Hive语法之连续full join主键重复(24)

    文章目录 连续full join 主键重复 问题复现 Hive 版本的问题 执行顺序的问题 写法有问题 解决方案 严格限制关联条件顺序 合并去重 关联coalesce 总结 连续full join 主 ...

  2. java获取表主外键_通过 jdbc 分析数据库中的表结构和主键外键

    文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...

  3. mysql中复合主键指什么作用_MySQL中什么是数据表的复合主键

    MySQL中什么是数据表的复合主键 发布时间:2020-11-23 14:03:11 来源:亿速云 阅读:108 作者:小新 这篇文章主要介绍MySQL中什么是数据表的复合主键,文中介绍的非常详细,具 ...

  4. mysql一个表中可以有几个主键_数据库的单个数据表中有几个主键?

    数据库的单个数据表中只能有一个主键.数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性:主键主要是用与其他表的外键关联,以及本记录的修改与删除. 数据库的单 ...

  5. 如何在oracle中查询所有用户表的表名、主键名称、索引、外键等

    使用select   *   from   user_tables   可以查询出所有的用户表. 查所有用户的表在all_tables 主键名称.外键在all_constraints 索引在all_i ...

  6. 如何列出引用SQL Server中给定表的所有外键?

    我需要在SQL Server数据库中删除一个高度引用的表. 我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL的答案更好.) #1楼 ...

  7. HIVE中的表以及语法

    2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...

  8. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  9. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

最新文章

  1. R 回归 虚拟变量na_工具amp;方法 | R语言机器学习包大全(共45个包)
  2. DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
  3. 飞鸽传书为我们提供了方便的聊天工具
  4. html中使用style设置背景
  5. Delphi 常用API 函数
  6. 453. Minimum Moves to Equal Array Elements 一次改2个数,变成统一的
  7. netsh命令改IP和重置winsock(可解决能上QQ不能上网的问题)
  8. idea下载Mybatis插件
  9. 扫描转换html,HTML5/CSS3 3D雷达扫描动画
  10. FloydFest 19 大赛冠军歌曲 Roll With Me,使用Peluso话筒录制
  11. 网易云信发送短信工具类
  12. html的nofollow标签,nofollow标签有什么用,网站怎么添加nofollow
  13. 双软企业的税收优惠政策怎么样?
  14. Oracle EBS R12 - Application patch可不可以reapply
  15. Ps 中英文版本切换批处理文件
  16. 1758 生成交替二进制字符串的最少操作数
  17. linux解压安装包失败了怎么办,解压文件出错怎么办?百度网盘、Winrar等解压文件出错解决办法...
  18. NVT平台PWM配置
  19. TD-SCDMA和2G互操作实现指导手册
  20. TeamViewer 连接不上

热门文章

  1. Adobe Premiere Rush v1.1 中文特别版 Mac 后期视频编辑软件
  2. 搭建Groovy开发环境
  3. 如何视频剪辑制作?几个剪辑软件分享
  4. 在 docker 中设置容器自动启动
  5. 如何保障自己的邮件安全
  6. JAVA毕业设计web企业人事管理信息系统计算机源码+lw文档+系统+调试部署+数据库
  7. linux如何将文件夹添加到书签,mac给pdf文件添加书签工具
  8. 小清新电商家具商城Bootstrap模板
  9. C语言scanf缓冲区去掉多余回车键
  10. 小学生如何用计算机写字,巧用信息技术培养小学生规范书写汉字的能力