Joinメッセージは、データテーブルを左右に(横方向に)連結します。
dt << Join( // 主テーブルへメッセージを送る
With( dataTable ), // 結合するデータテーブル
Select( columns ), /* 主テーブルで、出力テーブルに
追加する列を選択する */
Select With( columns ), /* 結合するデータテーブルで、出力テーブルに
追加する列を選択する */
// 結合の方法。ほかにも次のものがある。
Cartesian join、By Row Number、By matching columns(col1=col2, ...)
Merge Same Name Columns, // 同名の列をマージ
Copy Formula( 0 ), // デフォルトはオン。0でオフになる
Suppress Formula Evaluation( 0 ), // デフォルトはオン。0でオフになる
Match Flag( 1 ), /* 対応する列の値で結合する場合に、結合後のデータテーブルに「対応フラグ」列を追加する */
Update, /* 主テーブルのデータを、結合するテーブルのデータで更新する */
// 各テーブルのオプション:
Drop Multiples( Boolean, Boolean ), //重複する行を削除
Include Non Matches( Boolean, Boolean ), // 一致しない行も含める
Preserve Main Table Order(), // 主テーブルの順序を保持する
Output Table Name( "name" )); // 出力テーブルの名前
結合を試すために、まず「Big Class.jmp」を2つに分割しましょう。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
part1 = dt << Subset(
Columns( :名前, :年齢, :"身長(インチ)"n ),
Output Table Name( "Big Class 1" )
);
part2 = dt << Subset(
Columns( :名前, :性別, :"体重(ポンド)"n ),
Output Table Name( "Big Class 2" )
);
操作を実際の状況に近くするために、part 2の行を並べ替えます。
sortedPart2 = part2 << Sort( By( :名前 ), Output Table Name( "並べ替えたBig Class" ) );
これで、別々の2つの部分に分割され、それぞれの行の順序が異なるデータテーブルができました。2つのデータテーブルは、共通して持つ列の一致によって結合できます。
part1 << Join(
With( sortedPart2 ),
By Matching Columns( :名前 == :名前),
Preserve Main Table Order();
Output Table Name( "結合" );
);
結果テーブルには、各部分から1つずつ抽出された2つの「名前」変数のコピーがあり、これらを調べるとJoin(結合)の動作を理解できます。Robertの行が4つあることに注意してください。これは、各データテーブルにRobertの行が2つあり(元のテーブルにRobertの行が2つあった)、Join(結合)によってすべての可能な組み合わせが作成されたからです。
ヒント: 結合されたテーブルで元のデータテーブルと同じ順序を維持する(対応のある列で並べ替えるのではなく)には、Preserve Main Table Order()を含めます。このオプションにより、結合プロセスがスピードアップします。
結合の引数についての詳細は、『スクリプト構文リファレンス』のJSLメッセージを参照してください。