Hive命令执行NOT IN子句

时间:2014-01-02 09:46:45

标签: hadoop hive

我有两张桌子,tab1& TAB2。

tab1(T1)  tab2(T2)
a1         b1
b1         c1
c1         f1
d1         g1

我正在寻找T2中不存在的表T1中的值。 在这种情况下,输出应为a1 d1

我尝试过以下查询但无法获得正确的解决方案。

select distinct tab1.T1 from tab1 left semi join tab2 on (tab1.T1!=tab2.T2);

1 个答案:

答案 0 :(得分:17)

SELECT t1.str
FROM tab1 t1 
LEFT OUTER JOIN tab2 t2 ON t1.str = t2.str
WHERE t2.str IS NULL;

结果:

OK
a1
d1

“为什么 t2.str为空条件”:左外连接确保第一个表中的所有值都包含在结果中。那么当第二个表中没有值时会发生什么:在这种情况下,第二个表中的所有列都被报告为null。

因此,在上面的情况中,我们正在精确搜索第二个表项缺失的情况 - 因此我们:

  • 从表2中选择一个永不空(又名非空)列。
  • 那么:数字是一个永远存在的专栏吗?如果没有,那么请选择另一个
  • 指定条件“table1-alias”。“table1-never-null-column”= null。这意味着记录实际上不存在于连接条件中 - 因此我们发现记录仅存在于表1中。