HIVE子查询转换成连接

HIVE子查询

在hive中进行子查询,经常会报不支持子查询的错误,导致有些sql可能在mysql中可以使用但是在hive中却无法使用,因此在hive中可以采用连接替换子查询的方式。

左半连接

hive有一种连接方式,叫做左半连接,关键字为:LEFT SEMI JOIN,这种连接方式与左连接类似,但是属于一种查询的方式。

教师表(teacher):

id name
1 小六
2 小七
3 小八
4 小九

授课表(course):

id course_name teacher_id
1 编译原理 1
2 数据库 1
3 操作系统 2
4 计算机网络 3

那么对于mysql来说,我想要查询有课程安排的老师,SQL可以这样写:

SELECT * FROM teacher
WHERE id IN (
	SELECT teacher_id FROM COURSE
);

这样的子查询(简单举例,这样的子查询在hive是支持的)我们在HIVE中转换成如下的代码:

SELECT * FROM teacher T1
LEFT SEMI JOIN 
course T2
ON T1.id = T2.teacher_id

得到的结果就是:

id name
1 小六
2 小七
3 小八

实际上左半连接与连接有很大的差异,它并不会把右边的数据展现出来。 左半连接使用的右表仅仅是一个筛选条件,而ON 就是替代了SQL种的IN的作用,右表就是in中的表。

注意

左半连接由于只有左表的数据,因此在连接外面是无法使用右表的字段作为where条件的,对于整个语句来说,只有左表的字段才是合法字段。

和左连接的区别

左连接的话,如果关联的key在右边有多条数据,很有可能导致左表的数据产生分裂,例如本次的例子,改用左连接的结果:

id name id course_name
1 小六 1 编译原理
1 小六 2 数据库
2 小七 3 操作系统
3 小八 4 计算机网络
4 小九 NULL NULL

这样会导致左表数据产生分裂

你可能感兴趣的:(HIVE,SQL)