混淆'和'过滤器内部的过滤器

时间:2017-08-29 17:09:00

标签: sql hive hiveql

可以解释一下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'`

2 个答案:

答案 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)。