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——错误笔记
1.同一个项目(Project)下,不同的库(Package)之间默认不相互引用,注意这样的错误: 2.使用sklearn之前,需要安装scipy库
- windows 下启动运行 jar 包程序
windows 下 运行 jar 包 java -jar XXX.jar java -server -Xms1024m -Xmx20480m -jar $JAR_NAME.jar windows 后台 ...
- vue-router.esm.js:1905 TypeError: Cannot convert undefined or null to object
环境:vue+vuex+element 报错原因 ...mapState('isDialNumber') mapState如果传递一个参数,参数必须是数组 ...mapState(['isDialNu ...
- 前端node.js npm i 报错Unexpected end of JSON input while parsing near
清缓存 npm cache clean --force 重新安装 npm install
- 我们来说说self.setinterval
学了js的你,肯定知道setInterval方法是按照指定的周期(以毫秒计)来调用函数或计算表达,setInterval方法会不停地调用函数,直到clearInterval被调用或窗口被关闭,这个se ...
- 20175204 张湲祯 2018-2019-2《Java程序设计》第八周学习总结
20175204 张湲祯 2018-2019-2<Java程序设计>第八周学习总结 教材学习内容总结 -第十五章泛型与集合框架要点: 一.泛型 1.泛型(Generics)的主要目的是可以 ...
- SecureCRT标签显示IP地址
当使用SecureCRT连接到linux服务器后,SecureCRT的标签会随着操作目录的改变而改变,当连接多个的时候很不好区分,所以需要设置标签栏固定显示IP地址信息. options->Se ...
- Chrome浏览器自动填充<input>标签的密码
问题:登录页面登录时,Chrome浏览器保存了用户名和密码,在其他页面管理其他的账户和密码时,密码框先是显示正确的密码,然后一闪而过被覆盖. 原因:问了技术主管才得知,Chrome浏览器中的,保存用户 ...
- bzoj 2741
题目描述:这里 一道非常好的题 由于强制在线,我们必须要用一些数据结构来处理 考虑分块:将整个序列分块,块内部分预处理,块外部分暴力处理 对于每个块,计算出以这个块的左端点为端点,向右枚举这个块以后的 ...
- wtforms组件使用实例及源码解析
WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. WTforms作用:当网站中需要用到表单时,WTForms变得很有效.应该把表单定义为类,作为单独的一个模块. ...