hive中left/right join on连接中and与where的使用问题
很多同学在进行表关联的时候,and和where的使用有时候分不清,在这里实操记录下。
创建人员信息表并写入数据
create table tmp.userinfo
(
id string,
name string,
age string,
dept string
);
insert into tmp.userinfo values ('1','张三','12','1'),('2','张三1','223','2'),('3','张三2','23','3'),('4','张三3','243','4'),('5','张三4','523','5');
创建部门表并写入数据
create table tmp.deptinfo
(
id string,
name string
);
insert into tmp.deptinfo values('1','1'),('2','2'),('3','3'),('4','4'),('5','5'),('6','6')
现象
查询语句 select u.*,d.* from userinfo u left join deptinfo d on u.dept=d.id and u.age<'23';
结果如下:

查询语句 select u.*,d.* from userinfo u left join deptinfo d on u.dept=d.id where u.age<'23';
结果如下:

解释
在join中on是起到关联关系的连接作用,on后面指定的是关联条件,比如select * from A a left join B b on a.clientno=b.clientno 就是当两张表clientno相同才能关联上,
如果后面再跟上and的话,就是要同时满足这两个条件,如 select * from A a left join B b on a.clientno=b.clientno and a.sex=b.sex,其实这个可以将on后面看成一个整体:select * from A a left join B b on (a.clientno=b.clientno and a.sex=b.sex)
总结
select u.*,d.* from userinfo u left join deptinfo d on u.dept=d.id and u.age<'23';
-- 对于left join,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录,on后面的只作为关联条件。
select u.*,d.* from userinfo u left join deptinfo d on u.dept=d.id where u.age<'23';
-- where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉
比较好的写法
select u.*,d.* from (select * from userinfo where age<'23') u left join deptinfo d on u.dept=d.id;
如有纰漏,欢迎指正。
hive中left/right join on连接中and与where的使用问题的更多相关文章
- Hive&SqlServerql:inner join on条件中如果两边都是空值的情况下,关联结果中会把数据给过滤掉。
今天遇到的一个大坑,话不多少,看sql和下边的查询结果: --问题:恰好把buildingid is null的记录给过滤掉 ),buildingid ),)); ); ); ); ); ); ); ...
- 列表[‘hello’ , ‘python’ ,’!’ ] 用多种方法拼接,并输出’hello python !’ 以及join()在python中的用法简介
列表[‘hello’ , ‘python’ ,’!’ ] 用多种方法拼接,并输出’hello python !’ 使用字符串链接的四种方法都可以创建 字符串拼接一共有四种方法,也可以应用到列表的拼接中 ...
- arcgis中的Join(合并连接)和Relate(关联连接)
arcgis中的Join(合并连接)和Relate(关联连接) 一.区别 1.连接关系不一样. Relate(关联连接)方式连接的两个表之间的记录可以是“一对一”.“多对一”.“一对多”的关系 Joi ...
- 08_Hive中的各种Join操作
1.关于hive中的各种join Hive中有许多的Join操作,例如:LEFT.RIGHT和FULL OUTER JOIN,INNER JOIN,LEFT SEMI JOIN等: 1.1.准备两组数 ...
- sql中的inner join ,left join ,right join
左连接LEFT JOIN, 也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容.不满足连接条件的 ,连接字段栏位将对 ...
- SQL 中不同类型的表连接
http://www.linuxidc.com/Linux/2012-08/68035.htm 1.简介 在关系型数据库中,join操作是将不同的表中的数据联合在一起时非常通用的一种做法.首先让我们看 ...
- JOIN关联表中ON,WHERE后面跟条件的区别
select * from td left join (select case_id as sup_case_id , count(*) supervise_number from td_kcdc ...
- hadoop中MapReduce多种join实现实例分析
转载自:http://zengzhaozheng.blog.51cto.com/8219051/1392961 1.在Reudce端进行连接. 在Reudce端进行连接是MapReduce框架进行表之 ...
- MySQL中基本的多表连接查询教程
一.多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: SELECT * FROM table1 CROSS JOIN ...
随机推荐
- python和Java的几种容器比较
python里面有几种常用的容器用来存放数据 1.list 列表,在python中没有数据类型,所以可以在列表中存放各种类型的数据,比如把Java里面的整型和字符串放在一个容器里面如下所示 list ...
- UE4代码片断备份
在Actor内创建一个StaticMesh #include "Components/StaticMeshComponent.h" #include "Engine/St ...
- mvc RedirectToAction、mobile 重定向地址栏未改变
@using (Html.BeginForm("actionName", "controllerName", FormMethod.Post, new { da ...
- 3D Slicer中文教程(七)—图像中值滤波
1.中值滤波概念 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护边缘 ...
- 团队作业第六次-团队Github实战训练
格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目系统设计与数据库设计 团队名称:为了交项目干杯 GitHub地址:地址 作业目标:搭建一个相对公平公正的抽奖系统,根据QQ聊天记录, ...
- [Linux]返回被阻塞的信号集
一.概述 在另一篇实例说到,进程可以屏蔽它不想接收的信号集. 事实上这些被屏蔽的信号只是阻塞在内核的进程表中,因为他们不能递送给进程,所以状态是未决的(pending). 利用sigpending函数 ...
- Codeforces 558E A Simple Task (计数排序&&线段树优化)
题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...
- java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
1. java.util.Arrays 数组工具类 Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...
- vue.js遍历ajax请求的数据
<div id="dv" style="text-align: center;"><div class="head input-gr ...
- java项目----衣服购买
执行bat文件:注意t_temp.properties保存的文件是否为utf8编码native2ascii -encoding UTF-8 t_temp.properties r.properties ...