hive中left semi join 与join 的区别
LEFT SEMI JOIN:左半开连接会返回左边表的记录,前提是其记录对于右边表满足ON语句中的判定条件。对于常见的内连接(INNER JOIN),这是一个特殊的,优化了的情况。大多数的SQL方言会通过in.......exists结构来处理这种情况。
准备表:
create table dcx1107(
id bigint
);
insert into dcx1107 values(-1);
insert into dcx1107 values(1);
create table dcx_2(
id bigint
,role string
);
insert into dcx_2 values(-1,'C1');
insert into dcx_2 values(1,'C1');
insert into dcx_2 values(1,'C2');
查询数据:
--join的select的结果中可以有t1(左表),t2(右表)两张表的字段
select
t1.id,t2.role
from dcx1107 t1
join dcx_2 t2
on t1.id=t2.id;
结果:
--left semi join的select的结果中只允许出现t1(左表)表的字段
select
t1.id
from dcx1107 t1
left semi join dcx_2 t2
on (t1.id=t2.id);
--等价于
select
t1.id
from dcx1107 t1
where id in (select id from dcx_2)
;
--等价于
select
t1.id
from dcx1107 t1
where EXISTS (select 1 from dcx_2 t2 where t1.id=t2.id)
结果:
这样写会报错
select
t1.id,t2.role
from dcx1107 t1
left semi join dcx_2 t2
on (t1.id=t2.id);
总结:
对待右表中重复key的处理方式差异:因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join on 则会一直遍历。
left semi join 中最后 select 的结果只许出现左表,因为右表只有 join key 参与关联计算了,而 join on 默认是整个关系模型都参与计算了。
最新文章
- Principles of measurement of sound intensity
- ssh通道技术
- ED/EP系列2《文件结构》
- 英语之idiom
- 理解Java机制最受欢迎的8幅图
- quick-cocos2d-x游戏开发【6】——制作您自己的自定义效果button菜单
- 第11章 使用PHP从Web访问MySQL数据库
- Linux知识要点大全(第一章)
- .net core 添加 Swagger
- C# Winfom 中ListBox的简单用法
- Windows下的包管理工具-Scoop
- python做数据分析pandas库介绍之DataFrame基本操作
- putty配色备份
- [日常] Redis基本使用测试
- ECharts 柱状图顶部显示百分比
- HTML5 学习笔记 | LOADING...
- 角摩网发布在线制作Epub、Mobi格式的电子书
- ceph 对接openstack liberty
- java中的3大特性之多态
- tcl之控制流-for
热门文章
- (Java实现) 过河卒
- Java实现 蓝桥杯VIP 算法训练 二元函数
- Java实现 蓝桥杯VIP 算法训练 删除多余括号
- Java实现 洛谷 P1422 小玉家的电费
- arduino 的analogRead() 和analogWrite()
- PAT1040 Longest Symmetric String (25分) 中心扩展法+动态规划
- RabbitMQ系列之【启动过程中遇到问题及解决方案】
- @atcoder - AGC008E@ Next or Nextnext
- 解决GITLAB无法启动runsv no running
- TensorFlow从0到1之常量、变量和占位符详解(6)