首页 > 解决方案 > 在 HIVE 中加入评估顺序

问题描述

我试图运行一个在 HIVE 中使用多个连接的查询。

例子:

SELECT * 
FROM table1
LEFT JOIN table2          -- the table resulted from the inner join should be left joined to table1
INNER JOIN table3         -- this inner join should happen first between table2 and table3
ON table3.id = table2.id
ON table2.id = table1.id

我认为这在其他 SQL DBMS 上完全有效,但是 HIVE 给了我一个错误。这种连接(我真的不知道该怎么称呼它们,所以我不能用谷歌搜索它们)在 HIVE 中是非法的吗?

解决方法是一些子查询联合,但我更感兴趣的是获取有关这种语法的更多信息。

谢谢!

标签: sqljoinhive

解决方案


这是有效的 SQL 语法,应解析为:

FROM table1 LEFT JOIN
     (table2 INNER JOIN
      table3 
      ON table3.id = table2.id
     )
     ON table2.id = table1.id

按照惯例,ON子句与 s 交错JOIN,因此条件在JOIN指定的地方。但是,语法也允许这种结构。

我不使用这样的语法——而且我强烈反对在没有括号的情况下使用它——但我认为几乎所有数据库都支持它。

如果括号不起作用,您有两种选择。一个是子查询:

这是有效的 SQL 语法,应解析为:

FROM table1 LEFT JOIN
     (SELECT table2.id, . . . -- other columns you want
      FROM table2 INNER JOIN
           table3 
           ON table3.id = table2.id
     ) t23
     ON t23.id = table1.id

或使用RIGHT JOIN

SELECT table2 INNER JOIN
       table3
       ON table3.id = table2.id RIGHT JOIN
       table1
       ON table2.id = table1.id

在这种情况下,RIGHT JOIN应该是等价的。但是当涉及多个连接(并且不使用括号)时,获得完全相同的语义可能会很复杂。


推荐阅读