我希望使用TableB中显示的键对TableA的所有行进行子集化。
表A -
Idn X Y ...
12 * *
13 * *
14 * *
表B -
Idn A B C ...
12 * * *
12 * * *
14 * * *
我想选择TableA中的所有元素,其中键出现在TableB中。
以下SQL查询在Hive中不起作用 -
select * from TableA where Idn in (select distinct Idn from TableB) a;
我还有其他办法吗?
可以在一个查询中完成吗?
请注意,这两个表在Idn中都不一定是唯一的。
答案 0 :(得分:1)
像SEMI JOIN之类的东西应该这样做:
SELECT * FROM TableA LEFT SEMI JOIN TableB on (TableA.Idn = TableB.Idn)
LEFT SEMI JOIN以有效的方式实现不相关的IN / EXISTS子查询语义。从Hive 0.13开始,使用子查询支持IN / NOT IN / EXISTS / NOT EXISTS运算符,因此大多数JOIN不再需要手动执行。使用LEFT SEMI JOIN的限制是右侧表只应在连接条件(ON子句)中引用,而不能在WHERE-或SELECT子句等中引用。