HQL:为什么在JOIN语句中使用WHERE而不是ON ... AND?

时间:2015-02-13 01:57:24

标签: sql hive hql

假设我有以下查询:

SELECT a.column1,
a.column2,
b.column3
FROM table1 a
JOIN table2 b
ON a.column1 = b.column2
AND a.column2 = "value"
AND b.column3 = "other value"

为什么在过滤值而不是另一个AND时会使用WHERE,即

SELECT a.column1,
a.column2,
b.column3
FROM table1 a
JOIN table2 b
ON a.column1 = b.column2
AND a.column2 = "value"
WHERE b.column3 = "other value"

不会和AND总是使查询更快,因为它会在连接之前过滤掉数据吗?

3 个答案:

答案 0 :(得分:1)

据我所知,两个查询之间没有任何可衡量的效果差异。

我个人更喜欢在ON子句中保留Join条件,在Where子句中保留过滤条件。

如果你在where子句中保留过滤条件,它将更具可读性。

答案 1 :(得分:1)

现代rdbms查询优化器在构建高效的执行计划方面做得很好,比较两个查询创建的执行计划,它们是相同的。所以不会有性能差异。

您可能会发现,在向JOIN添加过滤条件时,老年人会建议提高性能,因为在FROM之前会对WHERE进行评估,从而在过程的早期过滤记录并节省时间。这只是来自旧数据库的工件。

我同意NoDisplayName,我通常会在JOIN子句中引用引用WHERE的1侧的过滤条件,除非需要外连接的情况。

答案 2 :(得分:0)

Hive仅支持equi-joins。 因此在ON子句中,您只能进行相等比较:

SELECT
  ...
FROM
  ... a
JOIN
  ... b
ON
  a.column1 = b.column2
  AND a.column2 = "value"

但不是:

ON
  a.column1 = b.column2
  a.column2 LIKE "value"

但你可以这样做:

ON
  a.column1 = b.column2
WHERE
  a.column2 LIKE "value"