Hello Dudu,

Thank you for previous reply. I tried all the scenarios but nothing is
working out. I need this condition with with minimal steps like by using
case when.

Please find the below


TableA
Code   Country    Type     Flag
101   US      Tax    X
101   USA      Tax    Y
101   CA      Tax    Y
101   CN      Tax    Y
142   US      Pus    S
142   CA      Pus    Y
142   CN      Pus    Y
101   USA      Pus    Y
119   USA      Tax    Y
129   USA      Tax    Y
101   USA      STORE    X
101   USA      OCP    X
142   CAN      Feed    X
101   USA      Feed    X
101   USA      Win    X
101   USA      Sal    X
192   US      Mod    X
142   USA      MO    X
101   US      Retail X
142   US      OAS    X
101   USA      OAS    Y

TableB
Code   Country    Type     Flag   Value
All        All           Retail      All    John
All       US          OM          X      John
ALL     US         OM          Y      Smith
101     All          OAS         All    John
142     All          OAS         All    John
192     All          Mod          All    Sean
101     All          Tax           X      John
101     All         Tax            Y      Smith
142     US         Pus          X      John
142     All          Pus          Y      Smith


This is how my data in reality looks like. *Type *column is the fixed
column here

Requirement : TableA LeftJoin TableB , stamp the matching *Value *from
TableB. Total result should have the number of rows as TableA

Scenario  1:

Select * FROM TableA a
    Left Join TableB b ON
    LOWER(TRIM(a.Type)) = LOWER(TRIM(b.Type))
    WHERE LOWER(TRIM(a.Code)) = (CASE WHEN LOWER(TRIM(b.Code)) =
LOWER('All') THEN LOWER(TRIM(a.Code)) ELSE LOWER(TRIM(b.Code)) END)
    AND LOWER(TRIM(a.country)) = (CASE WHEN LOWER(TRIM(b.country)) =
LOWER('All') THEN LOWER(TRIM(a.country)) ELSE LOWER(TRIM(b.country)) END)
    AND LOWER(TRIM(a.flag))  = (CASE WHEN LOWER(TRIM(b.flag)) =
LOWER('All') THEN LOWER(TRIM(a.flag)) ELSE LOWER(TRIM(b.flag)) END);
on the output the number of rows should be same as the left table, but as I
am apply WHERE data is getting filtered out and is giving only
matching records



Scenario 2: Suggested by you

Select * FROM TableA a
    Left Join TableB b ON
    LOWER(TRIM(a.Type)) = LOWER(TRIM(b.Type))
    AND LOWER(TRIM(a.Code)) = (CASE WHEN LOWER(TRIM(b.Code)) = LOWER('All')
THEN '%' ELSE LOWER(TRIM(b.Code)) END)
    AND LOWER(TRIM(a.country)) = (CASE WHEN LOWER(TRIM(b.country)) =
LOWER('All') THEN '%' ELSE LOWER(TRIM(b.country)) END)
    AND LOWER(TRIM(a.flag))  = (CASE WHEN LOWER(TRIM(b.flag)) =
LOWER('All') THEN '%' ELSE LOWER(TRIM(b.flag)) END);
As per the left join this is giving me the number of rows just as the left
side table but I am not having the matching records as per the
right table. I have NULLs on the right side.

Scenario 3: Cross Join

Select * FROM TableA a
    CROSS Join TableB b ON
    LOWER(TRIM(a.Type)) = LOWER(TRIM(b.Type))
    AND LOWER(TRIM(a.Code)) = (CASE WHEN LOWER(TRIM(b.Code)) = LOWER('All')
THEN '%' ELSE LOWER(TRIM(b.Code)) END)
    AND LOWER(TRIM(a.country)) = (CASE WHEN LOWER(TRIM(b.country)) =
LOWER('All') THEN '%' ELSE LOWER(TRIM(b.country)) END)
    AND LOWER(TRIM(a.flag))  = (CASE WHEN LOWER(TRIM(b.flag)) =
LOWER('All') THEN '%' ELSE LOWER(TRIM(b.flag)) END);
Giving same result as Scenario 2 - All the left columns with NULLs on right

I don't know if we still need to fine tune the query as Hive is not
supporting CASE WHEN just as in SQL. Your thoughts are more helpful to me.

Kishore


On Wed, Apr 20, 2016 at 12:04 PM, Markovitz, Dudu <dmarkov...@paypal.com>
wrote:

> The second version works as expected (after fixing a typo in the word
> ‘indicator’).
>
> If you don’t get any results you should check your data (maybe the fields
> contains trailing spaces or control characters etc.).
>
>
>
> If you’re willing to replace the ‘OUTER’ with ‘INNER’, there’s another
> option -
>
>
>
> *select*      *
>
>
>
> *from*                    b
>
>
>
>             *cross* *join*  a
>
>
>
> *where*       a.*type*      = b.*type*
>
>         *and* a.code      like *case* b.code      *when* 'ALL' *then* '%'
> *else* b.code      *end*
>
>         *and* a.indicator like *case* b.indicator *when* 'ALL' *then* '%'
> *else* b.indicator *end*
>
> *;*
>
>
>
> Dudu
>
>
>
>
>
> *From:* Kishore A [mailto:kishore.atmak...@gmail.com]
> *Sent:* Wednesday, April 20, 2016 5:04 PM
>
> *To:* user@hive.apache.org
> *Subject:* Re: Question on Implementing CASE in Hive Join
>
>
>
> Hi Dudu,
>
>
>
> Thank you for sending queries around this.
>
>
>
> I have run these queries and below are the observations
>
>
>
> 1. It did return the same error as before" SemanticException [Error
> 10017]: Line 4:4 Both left and right aliases encountered in JOIN 'code'"
>
>
>
> 2. Query execution is successful but not retrieving any results out of it.
>
>
>
> I am clueless and not able to proceed to next step until this is resolved.
> Do you have any other suggestions please?
>
>
>
> Kishore
>
>
>
> On Tue, Apr 19, 2016 at 6:08 AM, Markovitz, Dudu <dmarkov...@paypal.com>
> wrote:
>
> Please try the following two options.
>
> Option 2 might be better, performance wise (depending of the data volume
> and characteristics).
>
>
>
> P.s.
>
> I didn’t understand the explanation about the LEFT JOIN
>
>
>
>
>
> Dudu
>
>
>
> 1.
>
>
>
> *select*      b.code
>
>            ,b.*value*
>
>
>
> *from*                    b
>
>
>
>             *left* *join*   a
>
>
>
>             *on*          a.*type*      = b.*type*
>
>                     *and* a.code      like *case* b.code       *when*
> 'ALL' *then* '%' *else* b.code       *end*
>
>                     *and* a.indicator like *case* b.indicatior *when*
> 'ALL' *then* '%' *else* b.indicatior *end*
>
> *;*
>
>
>
>
>
>
>
> 2.
>
>
>
> *select*      b.code
>
>            ,b.*value*
>
>
>
> *from*                    b
>
>
>
>             *left* *join*   a
>
>
>
>             *on*          a.*type*      = b.*type*
>
>                     *and* a.code      = b.code
>
>                     *and* a.indicator = b.indicatior
>
>
>
> *where*       b.code       != 'ALL'
>
>         *and* b.indicatior != 'ALL'
>
>
>
> *union* *all*
>
>
>
> *select*      b.code
>
>            ,b.*value*
>
>
>
> *from*                    b
>
>
>
>             *left* *join*   a
>
>
>
>             *on*          a.*type*      = b.*type*
>
>                     *and* a.indicator = b.indicatior
>
>
>
> *where*       b.code        = 'ALL'
>
>         *and* b.indicatior != 'ALL'
>
>
>
> *union* *all*
>
>
>
> *select*      b.code
>
>            ,b.*value*
>
>
>
> *from*                    b
>
>
>
>             *left* *join*   a
>
>
>
>             *on*          a.*type*      = b.*type*
>
>                     *and* a.code      = b.code
>
>
>
> *where*       b.code       != 'ALL'
>
>         *and* b.indicatior  = 'ALL'
>
>
>
> *union* *all*
>
>
>
> *select*      b.code
>
>            ,b.*value*
>
>
>
> *from*                    b
>
>
>
>             *left* *join*   a
>
>
>
>             *on*          a.*type*      = b.*type*
>
>
>
> *where*       b.code       = 'ALL'
>
>         *and* b.indicatior = 'ALL'
>
> *;*
>
>
>
>
>
> *From:* Kishore A [mailto:kishore.atmak...@gmail.com]
> *Sent:* Tuesday, April 19, 2016 3:51 PM
> *To:* user@hive.apache.org
> *Subject:* Re: Question on Implementing CASE in Hive Join
>
>
>
> Hi Dudu,
>
>
>
> Actually we use both fields from left and right tables, I mentioned right
> table just for my convenience to check whether ALL from right table can be
> pulled as per join condition match.
>
>
>
> One more reason why we use left join is we should not have extra columns
> after join.
>
>
>
> Kishore
>
>
>
>
>
>
>
> On Tue, Apr 19, 2016 at 5:46 AM, Markovitz, Dudu <dmarkov...@paypal.com>
> wrote:
>
> Before dealing with the technical aspect, can you please explain what is
> the point of using LEFT JOIN without selecting any field from table A?
>
>
>
> Thanks
>
>
>
> Dudu
>
>
>
> *From:* Kishore A [mailto:kishore.atmak...@gmail.com]
> *Sent:* Tuesday, April 19, 2016 2:29 PM
> *To:* user@hive.apache.org
> *Subject:* Question on Implementing CASE in Hive Join
>
>
>
> Hi,
>
>
>
> I have a scenario to implement to cases in Hive Joins. I need to implement
> case on the value on which join condition to be applied.
>
>
>
> Table A
>
> Code// Type// Indicator// Value//
>
> A      1      XYZ         John
>
> B      1      PQR         Smith
>
> C      2      XYZ         John
>
> C      2      PQR         Smith
>
> D      3      PQR         Smith
>
> E      3      XYZ         Smith
>
> F      4      MNO         Smith
>
> G      3      MNO         Smith
>
> D      1      XYZ         John
>
> N      3      STR         Smith
>
>
>
>
>
> Table B
>
> Code// Type// Indicator// Value//
>
> ALL    1      XYZ         John
>
> D        3      ALL         Smith
>
> ALL    1      PQR         Smith
>
>
>
> I need to stamp Value from TableB by joining TableA and I am writing join
> condition as below.
>
> Note : No instance of ALL for Type column, a value for Type will be
> provided.
>
>
>
> Select b.Code,b.Value from B
>
> LEFT JOIN A a ON
>
> a.Code = (case when b.Code = 'ALL' then a.Code else b.Code END)
>
> AND
>
> a.Type = b.Type
>
> AND
>
> a.Indicator = (case when b.Indicatior = 'ALL' then a.Inidicator else
> b.Inidicator END)
>
>
>
> When I run this in hive this query is failing with below error
>
> Error while compiling statement: FAILED: SemanticException [Error 10017]:
> Line 4:0 Both left and right aliases encountered in JOIN 'Code'.
>
>
>
>
>
> Please let me know if more details are needed
>
>
>
> Thanks,
>
> Kishore
>
>
>
>
>
>
>

Reply via email to