2016年3月11日金曜日

SQLプロシジャの 「NATURAL JOIN」 で3つ以上のデータセットを結合すると意図した結果にならない。


タイトル通りのご指摘をいただきました。

 「NATURAL JOIN」 については以前紹介しています。
SQLプロシジャで結合条件を省略する方法。


というわけで試してみます。以下2つの例は3つのデータセットを「NATURAL JOIN」で結合しているプログラムです。
。。。FEEDBACKオプションでログにプログラムを展開してみると。。


例①
proc sql feedback;
   create table OUT1 as
   select * from
   (select name from SASHELP.CLASS a where AGE=11)
      natural full outer join
   (select name from SASHELP.CLASS b where AGE=12)
      natural full outer join
   (select name from SASHELP.CLASS c where AGE=13)
;
quit;

ログ (環境・バージョンによって挙動が異なるかもしれません)

  select COALESCE(C.Name, A.Name) as Name
    from ( select A.Name
             from SASHELP.CLASS A
            where A.Age = 11
         ) full outer join
         ( select B.Name
             from SASHELP.CLASS B
            where B.Age = 12
         ) on B.Name = A.Name full outer join
         ( select C.Name
             from SASHELP.CLASS C
            where C.Age = 13
         ) on C.Name = A.Name;


例②
data DT1 DT2 DT3;
   set SASHELP.CLASS;
run;

proc sql feedback;
   create table OUT1 as
   select * from
   (select name from DT1 a where AGE=11)
      natural full outer join
   (select name from DT2 b where AGE=12)
      natural full outer join
   (select name from DT3 c where AGE=13)
;
quit;


ログ(環境・バージョンによって挙動が異なるかもしれません)

  select COALESCE(C.Name, A.Name, B.Name) as Name
    from ( select A.Name
             from WORK.DT1 A
            where A.Age = 11
         ) full outer join
         ( select B.Name
             from WORK.DT2 B
            where B.Age = 12
         ) on B.Name = A.Name full outer join
         ( select C.Name
             from WORK.DT3 C
            where C.Age = 13
         ) on (C.Name = A.Name) and (C.Name = B.Name);



2つの例は同じようなプログラムなのに、展開されるプログラムが異なっています。
(青字と赤字の部分)

マニュアルみても言及してないし、仕様なのかバグなのか不明です。何かご存知の方いたら教えてください。

てことで、「NATURAL JOIN」 で 3つ以上のデータセットを結合しない方がよさそうです。


0 件のコメント:

コメントを投稿