可以解释一下HiveQL中这两个查询之间的区别。基本上我想从table a
过滤掉大于2017-05-01的日期。第二个查询没有给出我预期的结果,但第一个查询没有。我认为它们是等价的
select a.user_id
, b.user_id
, a.event_date
, b.event_date
, to_date(a.event_date)
from default.t1 as a
left join stage.t2 as b
on a.user_id = b.user_id
and a.event_date = b.event_date
where a.event_date >= '2017-05-01'
VS。
select a.user_id
, b.user_id
, a.event_date
, b.event_date
, to_date(a.event_date)
from default.t1 as a
left join stage.t2 as b
on a.user_id = b.user_id
and a.event_date = b.event_date
and a.event_date >= '2017-05-01'`
答案 0 :(得分:2)
left join
保留第一个表中的所有行,无论on
子句的计算结果是否为true。当on
子句的计算结果为true时,它也会在第二个表中包含所有匹配的行。否则,第二个表中的列为NULL
。
因此,left join
基本上忽略了第一个表上的任何过滤条件。无论如何,它都会保留第一个表中的行。
实际上,情况稍微复杂一些。如果on
条件未评估为true,则第二个表中的列均为NULL
。因此,在第二个查询中,当日期不匹配时,b
中的列应为NULL
。
怎么办?
left join
中第一个表格的条件应始终包含在where
条款中。on
子句中。答案 1 :(得分:1)
我发现类似的问题,@Sandeep Jindal的答案是最好的
SQL join: where clause vs. on clause
一个。 WHERE子句:加入后。加入后,记录将被过滤。
湾ON子句 - 加入之前。在加入之前将过滤记录(来自右表)。这可能最终在结果中为null(因为OUTER join)。