配置单元连接位置!=不起作用

g2ieeal7  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(286)

在hive中,我使用两个表,每个表都有相同的字段。我只需要表“one”中不在表“two”中的行。在这个时候,我没有得到任何返回结果。
表1

id  | category
i_1 | c_123
i_1 | c_234
i_1 | c_345
i_1 | c_456
i_2 | c_456

表二

id  | category 
i_1 | c_345

下面是我当前的代码(不返回任何行):

select a.id, a.category
from one a 
left join two b 
on a.id=b.id 
where a.category != b.category;

理想的结果应该是这样的:

id  | category
i_1 | c_123
i_1 | c_234
i_1 | c_456
i_2 | c_456
kfgdxczn

kfgdxczn1#

也许这就是你想要的:

select a.id, a.category
from one a 
  left join two b 
    on a.id=b.id 
      and a.category = b.category
where b.id is null

sql fiddle演示
这将返回表1中与id和category匹配的表2中不存在的所有记录。您的查询正在否定 outer join . 我不确定 hive 支架 not exists ,但这可能更有效。

pod7payv

pod7payv2#

此解决方案仅适用于Hive0.13+。
这是参考手册 NOT EXISTS 条款。

select a.id, a.category
from one a 
where not exists (
  select 1 
  from two b 
  where a.id = b.id and a.category = b.category
)

值得一提的是,它可以比 LEFT JOINWHERE x IS NULL 在一些数据库管理系统上。
我认为这是一个更好的实践,因为您不需要阅读整个查询就可以注意到 LEFT JOIN 实际上是反连接。

相关问题