2014年10月21日火曜日

SQLプロシジャ入門9:値を更新する【UPDATE】


SQLプロシジャによる変数値の更新方法を紹介。


サンプルデータ

data DT1;
   A=1; B="AA"; output;
   A=2; B="BB"; output;
   A=3; B="CC"; output;
run;

data DT2;
   A=2; B="YY"; output;
   A=3; B="ZZ"; output;
run;

データセットDT1
 A  
B
  1
  AA   
  2
  BB 
  3
  CC 

データセットDT2
 A 
B
  2  
  YY   
  3
  ZZ  



値の更新方法

方法1
proc sql;
   update  DT1
   set       B = "XX"
   where   A = 2 ;
quit;


データセットDT1
  A  
B
  1 
  AA   
  2
  XX 
  3
  CC 


基本構文
 UPDATE  対象のデータセット
 SET        更新する変数 = 格納する値
 WHERE   更新するレコードの条件


方法2
proc sql;
   update  DT1
   set       B = (select B from DT2 where DT1.A=DT2.A)
   where   exists (select * from DT2 where DT1.A=DT2.A);
quit;


データセットDT1
  A  
B
  1
  AA   
  2
  YY 
  3
  ZZ 


解説
他のデータセットを使って更新する方法。
処理内容を翻訳してみると以下のような感じになります。

 SET  B  = (DT1とDT2の変数Aがイコールになる時の、DT2の変数Bの値)
 WHERE     DT1とDT2の変数Aがイコールになるレコードを更新対象とする


間違えに注意
proc sql;
   update  DT1
   set       B = (select B from DT2 where DT1.A=DT2.A);
quit;


データセットDT1
  A  
B
  1
      
  2
  YY  
  3
  ZZ 


解説
よく間違えやすいのが、方法2でWHEREを入れ忘れてしまうケースです。
更新するレコードをWHEREで絞ってないので、DT1とDT2で変数Aがイコールになるものがない場合は欠損値が返されて、変数Bの値を欠損値として更新してしまう。



SQLプロシジャ入門記事一覧

2 件のコメント:

  1. なるほど~。勉強になりました

    返信削除
    返信
    1. コメントありがとうございます!
      そういっていって頂けると励みになります!

      削除