Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SAS proc sql left join to hash object

Tags:

hash

sas

I'm new to hash objects, but I'd like to learn more about them. I'm trying to find ways to substitute proc sql with hash object. I have to two tables, when i have a proc sql with inner join and an equal with hash object it works, but when i have a proc sql with left join i don´t know how to make in hash object. Thankyou very much. Sorry by my English.

Table01.

data Principal;
   input idd $ name $ Apellid1 $ valor $;
   datalines;
    1977 Arthur Pendrag 0001
    1978 Minerva  Athena 0001
    2011 Noe Arca 0001
    2014 Thor Hammer 0001
    0001 Seiya Pegaso 0001
    0002 Ikki Fenix 0001
    0003 Shun Andromeda 0001
    0004 Shiryu Dragon 0001
    0005 Yoga Cisne 0001
    0006 Naruto Konoha 0001
    0007 Sasuke Kun 0001
;

Table02

data Secundarea;
   input idd $ Apellid2 $ mival $;
   datalines;
    1977 Excalibu 0003
    1978 Atenea 0004
    2011 Biblia 0005
    2014 Odin 0006
    0001 Sagigario 0007
    0002 Virgo 0008
    0003 Piscis 0009
    0004 Libra 0010
    0005 Acuario 0011
    0008 Aries 0012
;

Proc sql inner join

proc sql;
create table sqlinner as
select *
from principal as p inner join secundarea as s
on p.idd=s.idd;
quit;

Hash object (inner join) it works

data mihashInner;
declare hash h();
h.defineKey('IDD');
h.defineData ('IDD','APELLID2','MIVAL');
h.defineDone();
do until(fin1);
    set SECUNDAREA  end=fin1;
    h.add();
end;
do until (fin2);
    set PRINCIPAL end=fin2;
   if h.find()=0 then
    output;
end;    
run;

Proc sql (left join)

proc sql;
create table sqlleft as
select *
from principal as p left join secundarea as s
on p.idd=s.idd;
quit;

How to make in hash object? I´m trying two ways.

data mihashLeft2;
declare hash h();
h.defineKey('IDD');
h.defineData ('IDD','APELLID2','MIVAL');
h.defineDone();
do until(fin1);
    set SECUNDAREA  end=fin1;
    h.add();
end;
do until (fin2);
    set PRINCIPAL end=fin2;
        rc=h.find();
    output;
end;

run;

Or this. But nothing. Thx.

data mihashLeft;
if 0 then set SECUNDAREA;
if _n_ =1 then do;
    declare hash hhh(dataset: 'SECUNDAREA', multidata:'y');
    hhh.DefineKey('IDD');
    hhh.DefineData('IDD','APELLID2','MIVAL');
    hhh.DefineDone();
   
    set PRINCIPAL;
    rc = hhh.find();
        if rc ne 0 then do;
            call missing(MIVAL);
            output;
        end;
        else
        do while(rc = 0);
            output;
            rc = hhh.find_next();
        end;
        end;
        run;
like image 448
ProSyth Avatar asked Jan 20 '26 05:01

ProSyth


1 Answers

You could try to do it like this:

data mihashLeft(drop=rc);
/*iterate left data set*/
set PRINCIPAL;
/*declare variables from hash set*/
length APELLID2 MIVAL $8 rc 8;
/*declare hash*/
if _n_=1 then do;
    declare hash hhh(dataset: 'SECUNDAREA', multidata:'y');
    hhh.DefineKey('IDD');
    hhh.DefineData('APELLID2','MIVAL');
    hhh.DefineDone();
end;
/*look for first row from hash set and output it even if it's not found*/
rc = hhh.find();
output;
/*loop to find other rows from the hash set*/
do while(rc=0);
    rc = hhh.find_next();
    /*output only if you found something*/
    if rc=0 then output;
end;

run;

like image 77
Bagin Avatar answered Jan 23 '26 21:01

Bagin