Full Join多个表与Union All多个表

这篇具有很好参考价值的文章主要介绍了Full Join多个表与Union All多个表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题描述

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

2. 问题复现

2.1. 插入数据

with   temp1 as (
select  '1' as id ,'张三' as name
union all 
select  '2' as id ,'李四' as name
union all 
select  '3' as id ,'王五' as name
),
temp2 as (
select  '1' as id ,'深圳' as city
union all 
select  '3' as id ,'北京' as city
union all 
select  '4' as id ,'上海' as city
),
temp3 as (
select  '1' as id ,'5000' as salary
union all 
select  '4' as id ,'10000' as salary
union all 
select  '5' as id ,'12000' as salary
)

2.2. 查询SQL以及问题

select
    coalesce(a.id, b.id, c.id) as id
    , a.name
    , b.city
    , c.salary
from temp1 as a
 
full join temp2 as b
on a.id = b.id
 
full join temp3 as c
on a.id = c.id

当执行如上查询SQL时,会发现其中 id = 4 的数据有重复,如下图所示:
full join 多张表,大数据系列三,数据库,sql,hive

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了的主键进行条件关联,如下代码:
方法1:

select
    coalesce(a.id, b.id, c.id) as id
    , a.name
    , b.city
    , c.salary
from temp1 as a
 
full join temp2 as b
on a.id = b.id
 
full join temp3 as c
on coalesce(a.id, b.id) = c.id

结果如下:
full join 多张表,大数据系列三,数据库,sql,hive
方法2:

select 
    temp.id
    , temp.name
    , temp.city
    , c.salary
from  
(select
    coalesce(a.id, b.id) as id
    , a.name 
    , b.city 
from temp1 as a
 
full join temp2 as b
on a.id = b.id) temp
full join 
temp3 as c
on temp.id = c.id

full join 多张表,大数据系列三,数据库,sql,hive
方法3:

select 
temp.id 
,temp1.name
,temp2.city
,temp3.salary
from 
(select id 
from  
(select 
id
from  temp1
union all 
select 
id
from  temp2
union all 
select 
id
from  temp3
) tt
group by id
) temp 
left  join temp1  
on temp.id = temp1.id
left  join temp2  
on temp.id = temp2.id
left  join temp3 
on temp.id = temp3.id

full join 多张表,大数据系列三,数据库,sql,hive文章来源地址https://www.toymoban.com/news/detail-599612.html

到了这里,关于Full Join多个表与Union All多个表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL开发实战技巧】系列(三十五):数仓报表场景☞根据条件返回不同列的数据以及Left /Full Join注意事项

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月12日
    浏览(60)
  • SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析

    SQL RIGHT JOIN返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。 注意:在某些数据库中,RIGHT JOIN被称为RIGHT OUTER JOIN。 在本教程中,我们将使用著名的Northwind示例数据库。 以下是“Orders”表的部分选择: OrderID C

    2024年02月05日
    浏览(53)
  • Flink-多流转换(Union、Connect、Join)

    无论是基本的简单转换和聚合,还是基于窗口的计算,我们都是针对一条流上的数据进行处理的。而在实际应用中,可能需要将不同来源的数据连接合并在一起处理,也有可能需要将一条流拆分开,所以经常会有对多条流进行处理的场景。 简单划分的话,多流转换可以分为“

    2024年02月14日
    浏览(50)
  • SQLite学习(七)SQLite的HAVING、DISTINCT、JOIN、UNION子句语法和应用

    在上一篇《SQLite学习(六)SQLite的GLOB、LIMIT、ORDER、GROUP UP子句语法和应用》 中,讲解了 SQLite的GLOB、LIMIT、ORDER、GROUP UP 子句语法,在本篇博客中,将继续讲解 SQLite 子句的基本语法。 同学们将学习到: SQLite HAVING 子句语法 SQLite DISTI

    2024年02月06日
    浏览(37)
  • 【postgresql 基础入门】多表联合查询 join与union 并,交,差等集合操作,两者的区别之处

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 入门准备 postgrersql基础架构 快速使用 初始化集群 数据库服务管理 psql客户

    2024年02月08日
    浏览(38)
  • 6、hive的select(GROUP BY、ORDER BY、CLUSTER BY、SORT BY、LIMIT、union、CTE)、join使用详解及示例

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月11日
    浏览(51)
  • SQL JOIN 子句:合并多个表中相关行的完整指南

    JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。 让我们看一下“Orders”表的一部分选择: OrderID CustomerID OrderDate 10308 2 1996-09-18 10309 37 1996-09-19 10310 77 1996-09-20 然后,看一下“Customers”表的一部分选择: CustomerID CustomerName ContactName Country 1 Alfreds Futterkiste Maria A

    2024年02月05日
    浏览(47)
  • 大数据Flink(九十):Lookup Join(维表 Join)

    文章目录 Lookup Join(维表 Join) Lookup Join 定义(支持 BatchStreaming) :Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维表 Join。

    2024年02月04日
    浏览(42)
  • GaussDB数据库SQL系列-UNION & UNION ALL

    目录 一、前言 二、GaussDB  UNION/UNION ALL 1、GaussDB UNION 操作符 2、语法定义 三、GaussDB实验示例 1、创建实验表 2、合并且除重(UNION) 3、合并不除重(UNION ALL) 4、合并带有WHERE子句SQL结果集(UNION ALL) 5、业务逻辑除重后合并(UNION ALL) 四、GaussDB UNION常见错误 1、“each UNION que

    2024年02月12日
    浏览(50)
  • 【flink番外篇】2、flink的23种算子window join 和interval join 数据倾斜、分区介绍及详细示例(1)- window join

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包