Hive JOIN中遇到左右别名,没有任何不等式子句

14

我正在使用以下查询:

Select
   S.MDSE_ITEM_I,
   S.CO_LOC_I,
   MAX(S.SLS_D) as MAX_SLS_D,
   MIN(S.SLS_D) as MIN_SLS_D,
   sum(S.SLS_UNIT_Q) as SLS_UNIT_Q,
   MIN(PRSMN_VAL_STRT_D) as PRSMN_VAL_STRT_D,
   MIN(PRSMN_VAL_END_D) as PRSMN_VAL_END_D,
   MIN(RC.FRST_RCPT_D) as FRST_RCPT_D,
   MIN(RC.CURR_ACTV_FRST_OH_D) as CURR_ACTV_FRST_OH_D,
   MIN(H.GREG_D) as  OH_GREG_D  
from
   eefe_lstr4.SLS_TBL as S  
left outer join
   eefe_lstr4.PRS_TBL P 
      on S.MDSE_ITEM_I = P.MDSE_ITEM_I 
      and S.CO_LOC_I = P.CO_LOC_I 
      and S.SLS_D between PRSMN_VAL_STRT_D and PRSMN_VAL_END_D  
left outer join
   eefe_lstr4.OROW_RCPT RC 
      on RC.MDSE_ITEM_I =S.MDSE_ITEM_I 
      and RC.CO_LOC_I =  S.CO_LOC_I  
left outer join
   eefe_lstr4.OH H 
      on H.MDSE_ITEM_I =S.MDSE_ITEM_I 
      and H.CO_LOC_I = S.CO_LOC_I  
group by
   S.MDSE_ITEM_I,
   S.CO_LOC_I;

我收到了一个错误,内容如下:

失败:语义异常 第0行:-1 在JOIN 'PRSMN_VAL_END_D'中同时遇到左右别名

搜索结果显示,当查询中存在不等式运算符时,会出现此错误。但是,即使我的查询中没有使用任何不等式运算符(只有=between),我仍然收到了这个错误。


3
“S.SLS_D在PRSMN_VAL_STRT_D和PRSMN_VAL_END_D之间”是一个不等式。 - Gordon Linoff
3个回答

24

尝试将不等式条件从on子句移动到where条件中。

Select S.MDSE_ITEM_I,S.CO_LOC_I,
       MAX(S.SLS_D) as MAX_SLS_D,
       MIN(S.SLS_D) as MIN_SLS_D,
       sum(S.SLS_UNIT_Q) as SLS_UNIT_Q,
       MIN(PRSMN_VAL_STRT_D) as PRSMN_VAL_STRT_D,
       MIN(PRSMN_VAL_END_D) as PRSMN_VAL_END_D,
       MIN(RC.FRST_RCPT_D) as FRST_RCPT_D,
       MIN(RC.CURR_ACTV_FRST_OH_D) as CURR_ACTV_FRST_OH_D,
       MIN(H.GREG_D) as  OH_GREG_D
from eefe_lstr4.SLS_TBL as S
         left outer join eefe_lstr4.PRS_TBL P on S.MDSE_ITEM_I = P.MDSE_ITEM_I and S.CO_LOC_I = P.CO_LOC_I 
         left outer join eefe_lstr4.OROW_RCPT RC on RC.MDSE_ITEM_I =S.MDSE_ITEM_I and RC.CO_LOC_I =  S.CO_LOC_I
         left outer join eefe_lstr4.OH H on H.MDSE_ITEM_I =S.MDSE_ITEM_I and H.CO_LOC_I = S.CO_LOC_I
where(S.SLS_D between PRSMN_VAL_STRT_D and PRSMN_VAL_END_D)
group by S.MDSE_ITEM_I, S.CO_LOC_I;

1
嗨@Unnikrishnan_R,为什么不等式在连接上不起作用而在where子句中起作用? - JKC
1
嗨@JKC,由于我们使用了左外连接,所以不等式在on条件中将无法工作。它将考虑连接左侧表中的所有行。 - Unnikrishnan R

15

我认为这种方法存在问题,因为它使用了left outer join,这意味着我们希望从左表中获得所有记录,如果我们将条件移动到where子句中,那么那些右表列null的记录就会丢失。


1
这个问题有解决方案吗? - Sanchit Grover
1
不要将 left join 的条件移到 where 子句中,而是将它们全部删除,并在选择语句中添加 IF(condition, var, NULL) AS var。但是,在这种情况下,您可能会得到比原始查询(如果它有效)更多的行数,但至少您不会丢失任何行。 - Robert Yi
@SanchitGrover,这个问题有解决方案吗?我现在正在苦苦挣扎。 - bernando_vialli
我通过使用子查询解决了这个问题。 选择从员工a 左连接(选择从薪资表,其中薪资> 1000的)b on a.employee_id = b.employee_id - Sanchit Grover

5

你说得对。where子句应该包括可能被删除的空值记录:

where (PRSMN_VAL_STRT_D为NULL)或(S.SLS_D在PRSMN_VAL_STRT_D和PRSMN_VAL_END_D之间)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接