2014-07-27 159 views
0

我有一個包含libnames及其表的列表的表。我想創建一個子查詢來爲每個列出的表返回最小的創建日期,並將libname和table作爲子查詢中使用的libname.table傳遞。Proc SQL中的SAS子查詢

我創建了以下內容:

proc sql; 
create table createdon_min as 
select *, 
cats("(select min(createdon) from "||strip(libname)||"."||strip(table_name)||")") as CREATEDON_FRM 
from all_tables1 
where freq="DAILY" AND part_date="CREATEDON"; 
quit; 

不會產生錯誤,但createdon_frm值不執行,它只是創造像「(選擇分鐘(createdon)從pvaprov.institutional一個字符串值)」。

正確解析了libname和table,但是如何獲取要作爲子查詢執行的語句?

+1

我不知道SAS'proc sql'支持動態SQL /準備語句。 –

+1

使用'SELECT INTO'構造並將你的動態語句傳遞給宏變量。然後使用宏循環來構建一個新的PROC SQL來執行每條語句。 –

回答

1

您不能從另一個sql查詢中動態調用sql查詢。此解決方案使用datastep並調用execute來執行proc sql並將結果附加到基礎數據集。

data want; 
length mincreatedon 8.; 
stop; 
run; 

data _null_; 
set all_tables1; 
where freq="DAILY" AND part_date="CREATEDON"; 
call execute("proc sql;create table a as select min(createdon) as mincreatedon from "||strip(libname)||"."||strip(table_name)||";quit;proc append base=want data=a;run;"); 
run;