sql - 在 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 中是非法的吗?
解决方法是一些子查询联合,但我更感兴趣的是获取有关这种语法的更多信息。
谢谢!
解决方案
这是有效的 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
应该是等价的。但是当涉及多个连接(并且不使用括号)时,获得完全相同的语义可能会很复杂。
推荐阅读
- sql - SQL IN 运算符和关联值
- javascript - 为什么 BootStrap TokenField 输入未在 POST 请求中传递?
- r - 在逻辑回归随机效应 GLMM 中绘制分类变量
- python - 具有多个属性的学习词典 - 当一个键有多个时如何编辑?
- python - 未找到 dlib 模块
- sorting - 快速排序与就地合并排序
- java - 字符串未显示在android studio中
- ruby - SQLite3 的 new() 在这个 ruby 示例中返回什么
- apache - 如何使用 htaccess 重定向这些
- javascript - 在 .subscribe() 中分配并返回一个变量