2017-01-16 21 views
0

テーブル名にマクロ変数を使用して複数のテーブルに結合しているマクロを作成しました。したがって、それはそのマクロ変数の異なる値に対して呼び出され、異なるテーブル名(マクロvarに基づいて)を使用して同じ処理を行います。しかし、いくつかの値については、結合のテーブルの1つが存在しない可能性があります、そして、私はそれに参加したくないでしょう。この場合には、私は左が、それはnon_existentテーブルだと第三のマクロ呼び出しでエラーが返されますので、発生する参加したくないので、条件付き結合方法(あるテーブルが存在しない場合)

example : /* example code*/ 
    macro test(cmpnynme,demog,deptt) ; 
    proc sql; 
    create table final as 
    select a.name, 
      b.age, 
      c.dept 
    from dpt_name_&cmpnynme. a 
    inner join demographics_&demog. b on a.dept_id = b.dept_id 
    left outer join depart_&deptt. c on a.dept_id = c.dept_id; 
    quit; 
    %mend; 

    %test(a,b,c); 
    %test(b,e,f); 
    %test(f,g,h); /*Macro calls */ 

は今、depart_h存在しません。 この問題を解決するにはどうすればよいですか?

答えて

0

条件を確認してクエリを作成し、PREPARE stmt3 FROM @QUERYで実行することができます。 EXECUTE stmt3; DEALLOCATE PREPARE stmt3;それぞれの条件を照会する照会ステートメントを連結することができます。

たとえば、

set @QUERY = ''; 
IF @conditionOne IS TRUE THEN 
SET @QUERY = CONCAT(@QUERY,"left outer join depart_",deptt,". c on a.dept_id = c.dept_id "); 
END IF; 
PREPARE stmt3 FROM @QUERY; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 

これらのステートメントで最終クエリを実行できます。 私はロジックが不足している場合はお知らせください。

+0

ここではT_SQLコードを書きましたが、これはSASで書かれていると思いますので、あなたのコードで何が行われているのかは分かりません。 – Rhea

+0

実際にMySqlのクエリは、マクロを介して変数を渡しています。これらの変数から条件を確認し、クエリを追加できます。最後に、準備されたクエリを実行することができます。それが私が見せたいものです! –

2

マクロロジックを使用して、条件付きで最後のLEFT JOIN句を生成します。 EXIST()関数を使用してテストできます。

%macro test(cmpnynme,demog,deptt) ; 
proc sql; 
    create table final as 
    select a.name 
     , b.age 
     , c.dept 
    from dpt_name_&cmpnynme. a 
    inner join demographics_&demog. b on a.dept_id = b.dept_id 
%if %sysfunc(exist(depart_&deptt)) %then 
    left outer join depart_&deptt. c on a.dept_id = c.dept_id 
; 
    ; 
quit; 
%mend test; 
+0

ありがとうTom、これは理にかなって私に希望を与えてくれますが、実際のクエリではこのjoin文の後にwhere句があるので、セミコロンを投稿することはできません。 – Rhea

+0

上記の私のコメントを無視してください、それはPROのように働いて、ありがとうTom! – Rhea

+0

最初の ';'は '%IF'ステートメントを終了し、2番目のステートメントは' create'ステートメントを終了します。 'where'節または' order by'節があれば ';'の前に置いて 'create'文を終了します。 – Tom

関連する問題