【问题标题】:Join evaluation order in HIVE在 HIVE 中加入评估顺序
【发布时间】:2021-07-16 10:18:43
【问题描述】:

我试图运行一个使用 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 中是非法的吗?

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

谢谢!

【问题讨论】:

  • 它在任何数据库中都无效,每个JOIN 句子必须有它各自的ON 子句。您需要在LEFT JOIN 之后设置最后一个ON (ON table2.id = table1.id) 和table2
  • 谢谢@habarnam,你最好研究一下这个链接,也许在你不需要创建这些问题之后
  • 不要粗鲁,jaime,这个问题特别指的是 HIVE。您应该先研究该链接,然后再评论它在任何数据库中都无效
  • 我不是无礼...我只是给了你一个回答你的问题,你只需看看我的评论,给一个链接,也许,你的问题的答案。如果您回答自己的问题,为什么还要问?...

标签: sql join hive


【解决方案1】:

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

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

按照惯例,ON 子句与JOINs 交错,因此条件是指定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 应该是等效的。但是当涉及多个连接(并且不使用括号)时,获得完全相同的语义可能会很复杂。

【讨论】:

  • 不幸的是我无法让它工作 - 使用括号它在括号行给我一个“无法识别输入”错误,没有括号它给我一个“无法识别输入”错误在第二个“ON " - 也许 hive 只是不允许这样的语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2015-11-02
相关资源
最近更新 更多