Hive SQL - 优化JOIN查询以忽略Null值

时间:2012-07-02 18:45:23

标签: sql join hive

我对SQL有点新意,所以请耐心等待。

我有两个表,每个表都有一个ID列。表A具有标题为角色的列,表B具有标题为结果的列。我想查询这些表以查找哪些基于ID的行具有role =' PS'和结果=' DE'。这是我的代码:

SELECT count(*)
FROM A JOIN B
ON (A.id = B.id
AND A.role = 'PS'
AND B.outcome = 'DE')

我一直在互联网上搜索这样做的方法,以便它不包含具有A.role或B.outcome空值的行。

上面的代码返回假设为40,100,即使B中的条目总数为B.outcome =' DE'只有40,000。因此,显然包括不符合我条件的条目。有没有办法更好地优化我的查询?

1 个答案:

答案 0 :(得分:1)

您的查询已排除nullA.role值的行。毕竟,null = 'PS'不是真的,你正在使用内连接。

有一个简单的解释,说明如何从连接中检索更多的行而不是B中的行。假设你有这些行用于A:

 A.id   A.role
 1      'A'
 1      'A'

这些行为B:

 B.id   B.outcome
 1      'A'
 1      'A'

然后这个查询:

select  *
from    A
join    B
on      A.id = B.id and A.role = 'A' and B.role = 'A'

将返回4行。这比表A或B中的更多!

所以我会调查id是否唯一:

select count(*) from A group by id having count(*) > 1
select count(*) from B group by id having count(*) > 1

如果这些查询返回的计数大于零,则id不是唯一的。由于连接为每个匹配重复行,这可以解释返回记录数量的大幅增加。

相关问题