2017-08-29 85 views
0

可以解釋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' 

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

您正在使用'left join',所以在第一個查詢中,您將得到結果,其中'b.event_date'可以爲null,然後篩選最終結果....在第二個日期條件中在連接中,所以你確保首先得到正確的數據....這是我的理解,但是,有人可以得到更好的解釋 – Hackerman

回答

2

A left join保留第一個表中的所有行,而不管on子句是否計算結果爲true。當on子句的計算結果爲true時,它也具有第二個表中的所有匹配行。否則,第二個表中的列是NULL

因此,left join基本上忽略了第一個表上的任何過濾條件。無論如何,它都會保留第一個表中的行。

事實上,情況稍微複雜一些。如果on條件未評估爲真,則第二個表中的列全部爲NULL。因此,在第二個查詢中,當日期不匹配時,b中的列應爲NULL

怎麼辦?

  • left join中的第一個表上的條件應始終在where子句中。
  • 第二張桌子上的條件應該始終在on條款中。
+0

感謝提示何時在'on'和'where'子句中使用過濾器。我一直有困難纏繞我的頭(不能想象它在我的頭上) – lollerskates

0

我發現類似的問題,由金達爾@Sandeep的回答是最好的

SQL join: where clause vs. on clause

一個。 WHERE子句:加入後。記錄將在聯接發生後被過濾。

b。 ON條款 - 加入前。記錄(來自右表)將在加入前被過濾。這可能會以結果爲空(因爲外部連接)。