webentwicklung-frage-antwort-db.com.de

In Hive JOIN traten sowohl linke als auch rechte Aliase auf. ohne jegliche Ungleichheitsklausel

Ich verwende folgende Abfrage:

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;

Ich bekomme einen Fehler und sage:

FAILED: SemanticException-Zeile 0: -1 Linke und rechte Aliase in JOIN 'PRSMN_VAL_END_D' angetroffen

Die Suche zeigt, dass dieser Fehler auftritt, wenn Sie eine Ungleichungsklausel in der Abfrage haben. Ich verwende jedoch keine Ungleichheitsklausel (<= oder >= in meiner Abfrage (nur = und between), selbst dann erhalte ich diesen Fehler.

6
abhiieor

Versuchen Sie, die Ungleichheitsbedingung von der on-Klausel in die where-Bedingung zu verschieben.

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;
14
Unnikrishnan R

Das Problem, das ich mit diesem Ansatz sehe, ist, dass, da es einen left outer join gibt, das heißt, wir wollen alle Register aus left table nur einmal haben, wenn wir die Bedingungen in die where-Klausel verschieben, dann diese Register wo right Tabellenspalten sind null gehen verloren.

8
Zoraida

du hast recht. Die where-Klausel sollte NULL-Werte enthalten, bei denen Datensätze gelöscht werden könnten:

wo (PRSMN_VAL_STRT_D IS NULL) oder (S.SLS_D zwischen PRSMN_VAL_STRT_D und PRSMN_VAL_END_D)

2
Kash