2016-01-14 90 views
2

我是新來的散列對象,但我想了解更多關於它們。我試圖找到用散列對象代替proc sql的方法。我有兩個表,當我有一個proc SQL與內部聯接,並與哈希對象相等的作品,但是當我有一個與左連接的PROC SQL我不知道如何在哈希對象。非常感謝你。對不起,我的英語。SAS proc sql左連接散列對象

表01。

`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內部聯接

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

Hash對象(內部連接)它的工作原理

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(左連接)

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

如何製作散列對象?我正在嘗試兩種方式。

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; 

或這個。但沒有。謝謝。

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; 

回答

1

你可以嘗試做這樣的:

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; 

運行;