コンテンツにスキップ

キー列を指定する結合

2 つのデータを、キー列の値が同じ行どうしでつなぎます。顧客マスタと購入履歴を顧客 ID でつなぐ、商品コードで単価表を引く、といった使い方をします。Excel の VLOOKUP にあたります。

同じカテゴリに結合が 3 つあります。値を突き合わせるのがこのページ、行の並び順でそのまま横に並べるのが単純な横結合、行を縦に積み増すのが単純な縦結合です。

入出力

ポート内容
左入力データデータ
右入力データデータ
出力データつないだデータ

Spark エンジンでも動きます。

設定項目

フォームの見出しの並び — 「対象列を設定」 → 「比較条件を設定」。条件によって出ない見出しもあります。

キー列を選択
左右でキー列の名前が同じかを選びます。左右のキー列名が同じ と 左右のキー列名が異なる の 2 つで、既定は 左右のキー列名が同じ です。
列を選択必須
左右のキー列名が同じ のときに出ます。キーにする列を選びます。複数選べます。左右どちらにもある列だけがキーとして使われます。
結合列設定必須
左右のキー列名が異なる のときに出ます。左ノードのキー列選択と右ノードのキー列選択の組を作ります。組は複数作れますが、左右の数は必ず同じになります。
結合タイプを選択
どちらのデータの行を残すか。6 種類あります(次の節)。既定は 共通部分を残す(inner join) です。
多対多の結合を有効にする
オプションの中にあります。既定は off。左右両方にキーの重複があるとき、off のままだと行数が増えすぎる恐れがあるとして処理を止めます。「条件を指定する」を on にしているあいだは、この項目自体が出ません(anti join のときは出ます)。
条件を指定する
オプションの中にあります。既定は off。キーの一致に加えて、大小比較の条件でも絞ります(期間内かどうかなど)。結合タイプが 共通部分を残す(inner join) / 左側のデータを残す(left join) / 右側のデータを残す(right join) / 左右両方のデータを残す(outer join) のときだけ出ます。

結合タイプ

左に A, B, C、右に B, C, D というキーがある場合に、残る行は次のとおりです。

結合タイプ残る行使いどころ
共通部分を残す(inner join)B, C両方にあるものだけが欲しい
左側のデータを残す(left join)A, B, C左を主にして、右の情報を足す
右側のデータを残す(right join)B, C, D右を主にして、左の情報を足す
左右両方のデータを残す(outer join)A, B, C, Dどちらも落としたくない
右に存在しない左のデータを残す(left anti join)A右にないものを探す(未購入の顧客など)
左に存在しない右のデータを残す(right anti join)D左にないものを探す

相手にない側の列は空欄になります。 これは anti join でも同じで、相手の列は付いたうえで、中身がすべて空欄になります。列ごと消えるわけではないので、要らなければ結合後に列選択/削除で外してください。

6 種類を同じデータで並べたところ

左のデータ(顧客ID と 年齢)と右のデータ(顧客ID と 性別)を 顧客ID でつなぎます。左は 1 / 2 / 5、右は 1 / 2 / 4 を持っています。

結合タイプ出力に残る顧客ID空欄になるところ
共通部分を残す(inner join)1, 2なし
左側のデータを残す(left join)1, 2, 55 の性別
右側のデータを残す(right join)1, 2, 44 の年齢
左右両方のデータを残す(outer join)1, 2, 4, 55 の性別、4 の年齢
右に存在しない左のデータを残す(left anti join)5性別(列は残り、全部空欄)
左に存在しない右のデータを残す(right anti join)4年齢(列は残り、全部空欄)

キー列の決まり

  • 左右どちらにもある列だけがキーになります。左右のキー列名が同じ で「すべての列」を選んでも、片方にしかない列はキーから外れます
  • 左右のキー列名が同じ では、キー列は出力に 1 列だけ残ります。左右のキー列名が異なる では、左右のキー列が両方残ります
  • 左右のキー列名が異なる では、左右の組の数が揃っていることが必要です。同じ列を 2 回指定することもできません
  • キー列の型が左右で違うとエラーになります。数値と文字列を突き合わせることはできません。型は「文字列 / 数値 / 日付 / 日付時間 / 時間」の 5 つで見るので、整数と小数はどちらも数値として扱われ、つなげます

行の並び方

結合タイプ出力の行の順番
共通部分を残す(inner join)左の行順
左側のデータを残す(left join)左の行順
右側のデータを残す(right join)右の行順
左右両方のデータを残す(outer join)キーの昇順に並び替わります
右に存在しない左のデータを残す(left anti join)左の行順
左に存在しない右のデータを残す(right anti join)右の行順

並び順が決まっていてほしいときは、結合のあとに行の並べ替えを置いてください。

同じ名前の列があるとき

キー以外に同じ名前の列があると、末尾に _x / _y が付きます。左から来た列が _x、右から来た列が _y です。

列の役割左入力右入力出力
キー顧客ID顧客ID顧客ID
同名の列登録日登録日登録日_x と 登録日_y

_x / _y を付けてもまだ名前がぶつかる場合は、さらに末尾に _1 から順の番号が付きます。

行数が増えることがある

キーが重複していると、組み合わせの数だけ行が増えます。 左に同じ顧客 ID が 2 行、右に 3 行あると、その顧客だけで 6 行になります。

左の重複右の重複結果
なしなし行数は増えない
ありなし左の行数のまま
なしあり右の重複の分だけ増える
ありあり止まる(「多対多の結合を有効にする」が必要)

両方に重複があるときだけ、処理を止めて確認を求めます。意図した結合なら「多対多の結合を有効にする」を on にしてください。意図していないなら、先に重複行の処理の処理タイプ「重複行を削除」でどちらかを 1 行にまとめます。

条件を指定する

キーの一致だけでなく、大小比較も条件に加えられます。「商品コードが一致し、かつ購入日が適用期間内」のような結合に使います。

条件は左右の両方の列を使います。 「対象のノードを選択」で選んだ側から比べられる列を取り、比べる相手の列は反対側から選びます。条件はいくつでも足せます。

条件 1 つぶんの設定項目
対象のノードを選択必須
比べられる側を 左側 か 右側 から選びます。既定は 左側。
左側の対象列を選択 / 右側の対象列を選択必須
比べられる列。「対象のノードを選択」で選んだ側から出ます。数値・日付・日付時間・時間の列だけ選べます。
比較タイプを選択必須
より小さい(<) / 以下(<=) / より大きい(>) / 以上(>=) / 範囲指定 のいずれか。
固定値を条件値にする
範囲指定以外のときに出ます。既定は off。相手の列と比べる代わりに、入力した値と比べます。on にすると 値を入力 の欄に変わります。
左側の列を選択 / 右側の列を選択必須
比べる相手の列。対象列とは反対側から選びます。「固定値を条件値にする」が off のときに出ます。
不等号選択必須
範囲指定のときに出ます。端を含むかどうかを次の 4 通りから選びます。始点値 < 対象値 < 終点値 / 始点値 ≦ 対象値 < 終点値 / 始点値 < 対象値 ≦ 終点値 / 始点値 ≦ 対象値 ≦ 終点値(既定)
固定値を始点にする / 固定値を終点にする
範囲指定のときに出ます。どちらも既定は off。off のあいだは、始点・終点を反対側のノードの列(「左側の始点列を選択」「右側の終点列を選択」など)から選びます。on にすると 値を入力 の欄に変わります。

エラーと対処

どのエラーも、左右それぞれのデータを 1 つ前のノードで開いて、列名と型を見比べるところから始めてください。

キー列の型が左右で違う

突き合わせるキー列の型が食い違っているとき。「条件を指定する」で選んだ列の型が食い違っているときも同じです。

{{mismatch_keys}} 列のデータ型が左右で異なります。どちらかに揃えてください。

直し方 — 列の型変更で型を揃えます。ID 列は、片方が数値・片方が文字列になっていることがよくあります。先頭の 0 が意味を持つ ID(00123)は、文字列に揃えてください。数値にすると 0 が消えます。

片方のデータが 0 行のときにも出ることがあります。 行が 1 つもないと、文字列の列と日付の列を見分けられないためです。前のノードで行が残っているか確かめてください。

共通のキー列がない

左右のキー列名が同じ で選んだ列が、右側に 1 つもないとき。

共通キー列が存在しません。

直し方 — 左右の列名を見比べてください。名前が違うなら 左右のキー列名が異なる に切り替えて組を作ります。

キー列の数が左右で違う

左右のキー列名が異なる で、左右の組が揃っていないとき。

キー列の数が左右で異なります。複数キーを指定する場合は左右で数を揃えてください。

直し方 — 組の片方だけが空になっていないか確かめてください。

同じ列を 2 回キーにしている

左右のキー列名が異なる で、片側のキー列に同じ列を重ねて指定したとき。

{{left_or_right}}キー列が重複しています。片方を除外するか、列名を変更してください。対象列: {{target_cols}}

直し方 — 重複している組を外します。

両方のキーに重複があり止まった

左右のどちらにもキーの重複があるとき。そのまま結合すると行数が急激に増えるため、実行前に止めます。

両方のデータで選択したキーに重複があり、組み合わせ爆発の懸念があるため処理を中止しました。処理を行う場合は、オプションの「多対多の結合を有効化する」チェックボックスを有効にして下さい。

メッセージの「多対多の結合を有効化する」は、画面の項目名「多対多の結合を有効にする」と 1 文字違いますが同じものです。

直し方 — まず重複が意図したものかを確かめてください。意図したものなら「多対多の結合を有効にする」を on にします。そうでなければ、重複行の処理の処理タイプ「重複行を削除」でどちらかを 1 行にまとめるか、キー列を足して一意になるようにします。

結合する列を選んでいない

キー列や条件の列を選ばずに実行したとき。

対象の列が選択されていません。

直し方 — 「列を選択」または「結合列設定」を埋めてください。「条件を指定する」を使っているなら、条件の中の列も埋めます。

選んだ列が見つからない

選んだ列が入力データにないとき。前のノードで列名を変えたり、列を削ったりすると起きます。

対象の列が存在しません。

直し方 — 列を選び直してください。

条件のキー列が設定されていない

「条件を指定する」を使うとき、キーの指定がないまま実行したとき。

条件が等しいキー列の設定が行われていません。

直し方 — 「列を選択」(または「結合列設定」)を埋めてください。条件だけでは結合できません。

列名が重複している

時間型のキー列を扱う途中で、左右の列名がぶつかったとき。

左右のデータで列名: {{colname}} が重複しています。片方の列名を変更してください

直し方 — 列名の変更で、結合前にどちらかの名前を変えてください。

左 / 右のデータがつながっていない

左側のデータが入力されていません。

右側のデータが入力されていません。

直し方 — 入力が 2 つあります。片方だけつないだ状態になっていないか確かめてください。

よく使う例

1. 購入履歴に顧客情報を足す

お題 — 購入履歴に、顧客マスタの氏名を足す。履歴は全部残したい

入力(左・購入履歴)

顧客ID金額
C0011200
C0023400
C009500

入力(右・顧客マスタ)

顧客ID氏名
C001田中
C002鈴木

設定 — キー列を選択 左右のキー列名が同じ、列を選択 顧客ID、結合タイプを選択 左側のデータを残す(left join)

出力

顧客ID金額氏名
C0011200田中
C0023400鈴木
C009500

2. 両方にあるものだけを残す

お題 — 今月と先月の両方で購入があった顧客だけを見たい

入力(左・今月)

顧客ID金額
C0011200
C0023400

入力(右・先月)

顧客ID金額
C002800
C005900

設定 — 列を選択 顧客ID、結合タイプを選択 共通部分を残す(inner join)

出力

顧客ID金額_x金額_y
C0023400800

同じ名前の 金額 が左右にあるので、金額_x(今月)と 金額_y(先月)に分かれます。

3. まだ買っていない顧客を探す

お題 — 顧客マスタのうち、購入履歴に出てこない顧客を知りたい

入力(左・顧客マスタ)

顧客ID氏名
C001田中
C002鈴木
C005佐藤

入力(右・購入履歴)

顧客ID金額
C0011200

設定 — 列を選択 顧客ID、結合タイプを選択 右に存在しない左のデータを残す(left anti join)

出力

顧客ID氏名金額
C002鈴木
C005佐藤

購入履歴側の 金額 列も付いてきて、中身は全部空欄です。要らなければ列選択/削除で外します。

4. 列名が違うキーでつなぐ

お題 — 左は 顧客ID、右は 会員番号 という名前だが、中身は同じ

入力(左)

顧客ID金額
C0011200

入力(右)

会員番号氏名
C001田中

設定 — キー列を選択 左右のキー列名が異なる、結合列設定で 左ノードのキー列選択 顧客ID / 右ノードのキー列選択 会員番号 の組を 1 つ作る

出力

顧客ID金額会員番号氏名
C0011200C001田中

キー列が両方残ります。 片方要らないなら列選択/削除で外してください。

5. 2 つの列でつなぐ

お題 — 店舗と日付の両方が一致する行をつなぎたい

入力(左・売上)

店舗日付売上
渋谷2024-01-05120000
新宿2024-01-0598000

入力(右・来客数)

店舗日付来客数
渋谷2024-01-05310
渋谷2024-01-06290

設定 — 列を選択で 店舗 と 日付 の 2 つを選ぶ、結合タイプを選択 共通部分を残す(inner join)

出力

店舗日付売上来客数
渋谷2024-01-05120000310

片方だけ一致しても結合されません。

6. 期間に当てはまる単価を引く

お題 — 購入履歴に、商品ごとの価格表から購入日に有効だった単価を付けたい

入力(左・購入履歴)

商品コード購入日
P12024-03-10

入力(右・価格表)

商品コード適用開始日適用終了日単価
P12024-01-012024-02-29100
P12024-03-012024-12-31120

設定

  1. キー列を選択 左右のキー列名が同じ、列を選択 商品コード
  2. 結合タイプを選択 左側のデータを残す(left join)
  3. オプションの「条件を指定する」を on
  4. 対象のノードを選択 左側、左側の対象列を選択 購入日、比較タイプを選択 範囲指定
  5. 不等号選択 始点値 ≦ 対象値 ≦ 終点値、右側の始点列を選択 適用開始日、右側の終点列を選択 適用終了日

出力

商品コード購入日適用開始日適用終了日単価
P12024-03-102024-03-012024-12-31120

商品コードが一致し、かつ購入日が適用期間に入っている行だけがつながります。

7. 1 人の顧客に複数の注文をつなぐ

お題 — 顧客ごとに 1 行のマスタに、顧客ごとに何件もある注文をつなぐ。行が増えるのは承知のうえ

入力(左・顧客マスタ)

顧客ID氏名
C001田中

入力(右・注文)

顧客ID注文ID
C001O-1
C001O-2

設定 — 列を選択 顧客ID、結合タイプを選択 左側のデータを残す(left join)

出力

顧客ID氏名注文ID
C001田中O-1
C001田中O-2

左は 1 行でしたが、右に 2 行あるので出力は 2 行になります。重複があるのは右だけなので、「多対多の結合を有効にする」は要りません。思ったより行が増えたときは、結合する前にそれぞれのデータで重複行の処理の処理タイプ「重複した行を抽出」を使い、キー列の重複を見てください。

関連