hive实现oracle merge into matched and not matched

news2025/2/27 17:19:51
create database cc_test;
use cc_test;
table1 可以理解为记录学生最好成绩的表。 table2可以理解为每次学生的考试成绩。
我们要始终更新table1的数据
create table table1 (
                        id string ,
                        maxScore string
);

create table table2 (
                        id string ,
                        score string
);

insert into table1 values
(1,100),
(2,100),
(3,100),
(4,100);

insert into table2 values
(2,100),
(3,90),
(4,120),
(5,100);

-----注意这里2重复 3score减少 4score增加 . 5属于新增数据

insert overwrite table1
select
    t1.id ,
    greatest(t1.maxScore,nvl(t2.score,0))
from table1 t1
         left join table2 t2
                   on t1.id =t2.id
union all
select
t2.id ,
t2.score
from table2 t2
where not exists (
    select 1  from table1 t1 where  t1.id = t2.id
)

----------------------------------或者下面这种写法

select
    t2.id ,
    greatest(nvl(t1.maxScore,0),t2.score)
from table2 t2
         left join table1 t1
                   on t1.id =t2.id
union all
select
    t1.id ,
    t1.maxScore
from table1 t1
where not exists (
    select 1  from table2 t2 where  t1.id = t2.id
)

两个的最后查询结果是ok的。

 

-------------------------------------------------------

最后说下思路。 table1 和table2 两个表

 t2 和t3 相当于id重叠的部分。

因为hive没有update ,所以一般update = delete+insert 。但是hive也没有delete。。。

所以oracle的matched not match 的删掉t2 插入t3 然后插入t4。

我们可以看做 插入t1  和插入 t3+t4

也可以看做 插入 t4 和插入 t1+t2

这两种就对应我们上面的两种sql

 你以为这就完了吗?怎么可能 就这么lowb的结束了。 我们要追寻更深层次的知识海洋。

两个有什么区别? 我们该选用那种好呢?

一般来说 table1 是远大于table2的。 例如学校每年的学生数量都差不多=table2.但是学校历史学生数据量是很大的=table1.

也不排除 该学校刚刚创立 第一年学生100 人 第二年学生1000人。。

但是一般来说倾向于 table1>>>>table2. 那么那种效率更高呢?

一般来说 外表大 内表小用in 。 外表小内表大用exists。

exists

insert overwrite table1 select t1.id , greatest(t1.maxScore,nvl(t2.score,0)) from table1 t1 left join table2 t2 on t1.id =t2.id union all select t2.id , t2.score from table2 t2 where not exists ( select 1 from table1 t1 where t1.id = t2.id )

in

insert overwrite table1 select t1.id , greatest(t1.maxScore,nvl(t2.score,0)) from table1 t1 left join table2 t2 on t1.id =t2.id union all select t2.id , t2.score from table2 t2 where t2.id not in ( select id from table1  )

join 

insert overwrite table1 select t1.id , greatest(t1.maxScore,nvl(t2.score,0)) from table1 t1 left join table2 t2 on t1.id =t2.id union all select t2.id , t2.score from table2 t2 left join table1 t1 on t1.id =t2.id  where t1.maxScore is null

个人来说是推荐用exists 和join这两种的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用于汽车传感器的混合点云语义压缩:性能评估

Hybrid Point Cloud Semantic Compression for Automotive Sensors: A Performance Evaluation https://arxiv.org/pdf/2103.03819.pdf 在自动驾驶中,车辆与车辆之间的信息共享起着重要作用。在所有传感器中,激光雷达产生的3D点云的数据量通常较高。因…

设计模式实践示例

以下是我针对自己所掌握的知识出的设计模式题目,有不足的地方欢迎指摘。 一、设计模式原则 设计模式原则有哪些? 1.开闭原则:对扩展开放,对修改关闭 2.接口隔离原则:每个接口只完成单独业务的部分,不要将…

设计模式之工厂模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、工厂模式是什么? 工厂模式是一种创建型的软件设计模式。定义一个用于创建对象的工厂接口,并让工厂子类…

MybatisPlus------application文件配置新增SQL打印以及测试类编写(二)

MybatisPlus------application文件配置新增SQL语句打印以及测试类编写 增加日志打印,具体打印执行的SQL语句。 操作: 只需在application配置文件中增加如下配置: mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout…

快递员配送手机卡,要求当面激活有“猫腻”吗?

咨询:快递员配送手机卡,要求当面激活有“猫腻”吗?有些朋友可能在网上看到了一些关于快递小哥激活会采集信息的文章,所以觉得让快递小哥激活流量卡并不安全,其实,哪有这么多的套路,只要你自己在…

一文看懂Java语言与Java生态圈

Java语言与Java生态圈 1、Oracle JDK与Open JDK之间的关系 Oracle JDK Java最早是由SUN公司发明,Oracle JDK之前叫SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购之后被名为Oracle JDK,实际上&#xff0…

【图文教程】笔记本总是自动关机怎么办?win11自动关机问题解决方案

使用场景及环境: 日常使用,代码、文档使用。 系统:win11、win10、win8、win7笔记本都可通用 笔记本:联想ThinkPad E450 笔记本相关性能参数 设备名称 XXX 处理器 Intel Core™ i3-8145U CPU 2.10GHz 2.30 GHz 机带 RAM 8.00 GB (…

JavaEE——MyBatis的简单介绍和使用

MyBatis是什么 MyBatis是一个支持普通SQL查询,存储过程以及高级映射的持久层框架,他消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射成数据库中的记…

StarUML画流程图

1. 前言 工作中,在写文档总结时,对于需求的理解总有一个重要的环节,那就是画流程图,Ubuntu下我推荐使用StartUML 来画,嘎嘎好用,如果不知道这个工具,请参考笔者这篇文章下载安装: U…

关于springboot读取配置类,使用@Autowired自动注入为null的问题

问题 之前写了一个配置类,读取config.yml配置文件里写好的阿里云oss的一些参数配置。配置类读取并无问题,但是在另一个普通类里自动注入该配置类时,引用配置类属性却报NullPointer异常。然后终于发现问题原因了。 代码 1. 配置文件 appli…

GeoTools:Shapefile创建

在上一篇文章《GeoTools:Feature&Shapefile之CRUD操作》中,介绍了基于GeoTools的Shapefile文件CRUD基本操作,那么,能否使用GeoTools创建Shapefile文件呢?答案是可以的。以下,我们将深入讨论如何实现。 …

零基础机器学习做游戏辅助第十二课--原神自动钓鱼(二)

一、模拟训练环境 上节课我们已经能够判断人物的钓鱼状态,接下来我们就需要对鱼儿上钩后的那个受力框进行DQN训练。 方案有两个: 使用卷积神经网络直接输入图像对网络进行训练。使用普通网络,自己写代码模拟出图像中三个点的动态并把值给神经网络进行训练。这里我们选用第二…

IB数学课程有哪些异同?如何选课?

自从IBDP在2019年进行数学课程改革后,许多IB小伙伴们就不知该如何选课了……改革后的IB数学课程包括4门课程,也就是:● Mathematics: analysis and approaches SL & HL (first assessment 2021)● Mathematics: applications and interpr…

科技云报道:“吞金兽”ChatGPT背后:AI算力告急!

科技云报道原创。 近两个月来,全世界的网友们都在兴致勃勃的“调教”ChatGPT,但第一个受不了的却是ChatGPT的所有者。 为了更长远的发展,OpenAI宣布了付费订阅版ChatGPT Plus,每月收费20美元。 虽然OpenAI表示,将持…

Monorepo or 物料市场?结合工作实际情况对公司现有前端体系的思考

前言 去年年中基于若依vue前端框架进行了改造,加上后端的配合,我写了一套脚手架和项目中后台模板。中后台模板中包含了许多基础代码,比如登录/注册、路由、权限等等相关功能。这个中后台模板是基于我们实际开发定制的,所以跟通用…

SpringBoot——配置文件

项目中有许多公共使用的变量,例如端口号,连接数据库的配置,还有我们自己创建的变量,这些可以放到SpringBoot的配置文件中统一调配使用 properties 基本语法格式: keyvalue例如配置项目的端口号为8888: …

Bean注入到Spring方式

扒一扒Bean注入到Spring的那些姿势 配置文件的方式就是以外部化的配置方式来声明Spring Bean,在Spring容器启动时指定配置文件。配置文件方式现在用的不多了,但是为了文章的完整性和连续性,这里我还是列出来了,知道的小伙伴可以自…

Jetson Xavier NX设备将opencv和tensorrt链接到conda环境

注意安装的时候先查看设备旧版本的opencv,卸载干净后再装。 Jetpack4.6 opencv4.1.1 conda安装 过程翻一下之前的博客把,下面是创建环境开始 conda create -n py36 python3.6.9 OPENCV_EXTRA_MODULES_PATH/home/ta/open/opencv_contrib-4.1.1/modul…

白银走势图如何做空?

做现货白银的好处是,我们可以在白银走势图上做空,不再像股票那样只能先卖后买,还能先卖后买,这样我们做投资就多了一份从容!任何时候我们都能获得投资获利的机会,但是由于习惯了单向交易,我们要…

Sarsa算法讲解及实现

Sarsa算法讲解及实现 1. Q表格 我们使用表格来存储每一个状态 state, 和在这个 state 每个行为 action 所拥有的 Q 值。 Q即为Q(s,a)就是在某一时刻的 s 状态下(s∈S),采取动作a (a∈A)动作能够获得收益的期望,环境会根据agent…