在连接表时,Hive查询出现错误。

11

使用下面的HIVE查询,我无法通过相等性检查。

我有3个表,想要将这些表连接起来。我尝试了以下方法,但是遇到错误:

FAILED: Error in semantic analysis: Line 3:40 Both left and right aliases encountered in JOIN 'visit_date'

select t1.*, t99.* from table1 t1 JOIN 
    (select v3.*, t3.* from table2 v3 JOIN table3 t3 ON
    ( v3.AS_upc= t3.upc_no AND v3.start_dt <= t3.visit_date  AND v3.end_dt >= t3.visit_date AND v3.adv_price <= t3.comp_price ) ) t99 ON
    (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);

在FuzzyTree的帮助下编辑:

第一点:

我们尝试使用between和where子句编辑上面的查询,但是查询没有返回任何输出。

但是,如果我们删除基于日期的between子句并改为基于“v3.adv_price <= t3.comp_price”的条件,那么可以得到一些输出,但没有使用“日期过滤器”。

select t1.*, t99.* from table1 t1 JOIN
    (select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no) 
        where v3.adv_price <= t3.comp_price
    ) t99 ON
    (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);

第二:

接下来我们尝试只传递一个日期,如下:

select t1.*, t99.* from table1 t1 JOIN
        (select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no) 
            where v3.adv_price <= t3.comp_price and v3.start_dt <= t3.visit_date
        ) t99 ON
        (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);

现在它显示了一些结果,但如果我们通过起始和结束日期过滤,则不会显示任何结果。

1个回答

31

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

Hive仅支持等值连接、外部连接和左半连接。由于将这些条件表达为Map/Reduce作业非常困难,Hive不支持非等值连接条件。

请尝试将您的不等式转移到“where”子句中。

select t1.*, t99.* from table1 t1 JOIN
    (select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no) 
        where t3.visit_date between v3.start_dt and v3.end_dt
        and v3.adv_price <= t3.comp_price
    ) t99 ON
    (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no);

1
我根据你的帮助编辑了查询,但仍然无法从查询中获取输出。我已更新了我的原始帖子。 - Agustus
我遇到了同样的问题。建议的解决方案很好。不过我注意到错误消息可能需要改进,因为它是误导性的。 - paolov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接