假设我有以下查询:
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总是使查询更快,因为它会在连接之前过滤掉数据吗?
答案 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"