BookmarkSubscribeRSS Feed
aaaaa34
Calcite | Level 5

 

Hi,

 

I have warning related with my code.

 

Firstly, I create datasets. Secondly, I want to choose good values of "univer" variable (only these contain "place" variable). Finally, I want to join these good values with "rate" variable but I don't know how to do this without creating new set- SAS shows: 

 

This CREATE TABLE statement recursively references the target table. A consequence of this is a possible data integrity
problem.

 

data aaa;
input  univer $50. ;
datalines;
wse and 
uww should be chosen 
we dont't have any values 
;
run;
data bbb;
input  place $ rate 1.;
datalines;
wse 8 
uww 8 
eel 9
;
run;
%macro first(data_out=);
%let list_place= wse!uww!ee1;
data xxx_place;
	set aaa;
	%let i_1=1;		
	%do %until (%qscan(&list_place,&i_1,'!') = %str());              
    	%let v1=%scan(&list_place,&i_1,'!');
    		find(univer,"&v1") >0 or
	    %let i_1=%eval(&i_1+1);
	%end;
	choice=1;
run;
proc sql;
create table xxx_place as
  select a.*,b.*
  from xxx_place a inner join bbb b
    on find(a.univer,b.place,'it')
  order by 1,2,3
;
quit;

data &data_out;
set xxx_place;
run;
%mend;

%first(data_out=mydata);

 

 

5 REPLIES 5
Kurt_Bremser
Super User

I really don't see the necessity of a macro here, as the sole parameter is used exactly once in the code. A simple %let data_out= would do the same.

And your WARNING has nothing to do with the macro, it comes from potentially dangerous SQL code. You should not create a table in a select from that same table, create a new table instead:

proc sql;
create table &data_out. as
  select a.*,b.*
  from xxx_place a inner join bbb b
    on find(a.univer,b.place,'it')
  order by 1,2,3
;
quit;

That way you also don't need the last data step.

aaaaa34
Calcite | Level 5
Yes, I understand that macro is not necessery in this case. But I really want to have it there. Is it other option to add "rate" without using proc sql?
aaaaa34
Calcite | Level 5

Hi,

That's what I want to obtain:

2.PNG

Kurt_Bremser
Super User

If you want to do a more complex lookup without using SQL, a hash object comes in handy:

data aaa;
input univer $50.;
datalines;
wse and 
uww should be chosen 
we dont't have any values 
;
run;

data bbb;
input place $ rate;
datalines;
wse 8 
uww 5 
eel 9
;
run;

data want;
length
  univer $50
  place $8
  rate 8
;
if _n_ = 1
then do;
  declare hash lookup(dataset:"bbb");
  lookup.definekey("place");
  lookup.definedata("rate");
  lookup.definedone();
end;
call missing(place,rate);
set aaa;
do i = 1 to countw(univer);
  place = scan(univer,i);
  rc = lookup.find();
  put rc= place=;
end;
if rate;
drop rc i place;
run;

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to connect to databases in SAS Viya

Need to connect to databases in SAS Viya? SAS’ David Ghan shows you two methods – via SAS/ACCESS LIBNAME and SAS Data Connector SASLIBS – in this video.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 5 replies
  • 1223 views
  • 0 likes
  • 2 in conversation