LoginSignup
3
1

More than 1 year has passed since last update.

Qlik Sense:ロードエディタにおけるJoinについて

Posted at

はじめに

Joinを使えば、複数のテーブルを結合できます。
Qlik SenseのロードエディタにおけるJoinの動きと、SQL文のJoinとの対比について整理しました。

環境

  • Windows11 64bit
  • Qlik Sense Desktop 14.78.7

Qlik Senseのロードエディタで検証しましたが、QlikViewのロードスクロプトでも同様の結果になります。

構文

Joinの構文です。

出典:Join ‒ Windows 用 Qlik Sense

[inner | outer | left | right ]Join [ (tablename ) ]
( loadstatement | selectstatement )

引数は次の通りです。

引数 説明
tablename
(左テーブル)
名前が付いたテーブルが、ロード済みのテーブルと比較されます。
loadstatement、または
selectstatement
(右テーブル)
ロード済みテーブルの LOAD または SELECT ステートメントです。

ロード済みの 左テーブル右テーブル を結合する例です。
同じ名前のフィールドをキーに結合します。

左テーブル:
LOAD * FROM [左テーブル];

Join(左テーブル)
LOAD * FROM [右テーブル];

JOINのあとにテーブルを指定しなければ、直前に読み込んだテーブルと結合します。

左テーブル:
LOAD * FROM [左テーブル];

Join
LOAD * FROM [右テーブル];

JOINの種類

QlikにおけるJOINには、つぎの種類があります。

  • Inner Join
  • Left Join
  • Right Join
  • Outer Join(もしくはJoin)

それぞれの違いについて、実際に実行しながら動きをみていきます。
次の2つのデータをサンプルとして使用します。

  • 左テーブル.csv

    ID col_A
    A aaa
    B bbb
    C ccc
  • 右テーブル.csv

    ID col_B
    C ccc
    D ddd
    E eee

inner Join

Inner Joinは内部結合ともいいます。
両方のテーブルで結合キーが一致するレコードだけを取得します。

例文は次の通りです。

左テーブル:
LOAD *
FROM [lib://sample/左テーブル.csv];

Inner Join(左テーブル)
LOAD *
FROM [lib://sample/右テーブル.csv];

実行した結果です。

ID col_A col_B
C ccc ccc

SQL文で書き換えると次のようになります。

SELECT *
FROM 左テーブル
INNER JOIN 右テーブル
ON 左テーブル.ID = 右テーブル.ID

Left Join

Left Joinは外部結合の一種で、左外部結合ともいいます。
左テーブルの全レコードと、結合キーが一致する右テーブルのレコードを取得します。
結合キーが一致しない場合、Nullを表示します。

例文は次の通りです。

左テーブル:
LOAD *
FROM [lib://sample/左テーブル.csv];

Left Join(左テーブル)
LOAD *
FROM [lib://sample/右テーブル.csv];

実行した結果です。

ID col_A col_B
A aaa -
B bbb -
C ccc ccc

SQL文で書き換えると次のようになります。

SELECT *
FROM 左テーブル
LEFT JOIN 右テーブル
ON 左テーブル.ID = 右テーブル.ID

Right Join

Right Joinは外部結合の一種で、右外部結合ともいいます。
右テーブルの全レコードと、結合キーが一致する左テーブルのレコードを取得します。
結合キーが一致しない場合、Nullを表示します。

例文は次の通りです。

左テーブル:
LOAD *
FROM [lib://sample/左テーブル.csv];

Right Join(左テーブル)
LOAD *
FROM [lib://sample/右テーブル.csv];

実行した結果です。

ID col_A col_B
C ccc ccc
D - ddd
E - eee

SQL文で書き換えると次のようになります。

SELECT *
FROM 左テーブル
RIGHT JOIN 右テーブル
ON 左テーブル.ID = 右テーブル.ID

Outer Join

Outer Joinは外部結合の一種です。
両方のテーブルで結合キーが一致するレコードに加え、結合キーが一致しない左テーブルと右テーブルのレコードも表示します。
SQL文におけるFull Join(完全外部結合)と同じ動きになります。
Outerは省略できます。

例文は次の通りです。

左テーブル:
LOAD *
FROM [lib://sample/左テーブル.csv];

Outer Join(左テーブル)
LOAD *
FROM [lib://sample/右テーブル.csv];

実行した結果です。

ID col_A col_B
A aaa -
B bbb -
C ccc ccc
D - ddd
E - eee

SQL文で書き換えると次のようになります。

SELECT *
FROM 左テーブル
FULL JOIN 右テーブル
ON 左テーブル.ID = 右テーブル.ID

結合キーがないとき

同じ名前のフィールドがない場合の動きをみていきます。
次の2つのデータをサンプルとして使用します。

  • 左テーブル_IDなし.csv

    col_A
    aaa
    bbb
    ccc
  • 右テーブル_IDなし.csv

    col_B
    ccc
    ddd
    eee

結合キーがない場合、左テーブルの全行に対して右テーブルの全行をつけて表示します。
SQL文におけるCross Join(交差結合)と同じ動きになります。
結合キーがないため、Joinの種類にかかわらずすべて同じ結果となります。

例文は次の通りです。

左テーブル:
LOAD *
FROM [lib://sample/左テーブル_IDなし.csv];

Join(左テーブル)
LOAD *
FROM [lib://sample/右テーブル_IDなし.csv];

実行した結果です。

col_A col_B
aaa ccc
aaa ddd
aaa eee
bbb ccc
bbb ddd
bbb eee
ccc ccc
ccc ddd
ccc eee

SQL文で書き換えると次のようになります。

SELECT *
FROM 左テーブル
CROSS JOIN 右テーブル

おまけ:結合キーが重複している場合について

結合キーが重複している場合の動きについてみていきます。
次の2つのデータをサンプルとして使用します。

  • 左テーブル_ID重複あり.csv

    ID col_A
    A aaa
    B bbb
    B www
    C ccc
    C xxx
  • 右テーブル_ID重複あり.csv

    ID col_B
    C ccc
    C yyy
    D ddd
    D zzz
    E eee

例文は次の通りです。
Left Joinで試してみます。

左テーブル:
LOAD *
FROM [lib://sample/左テーブル_ID重複あり.csv];

Left Join(左テーブル)
LOAD *
FROM [lib://sample/右テーブル_ID重複あり.csv];

実行した結果です。

ID col_A col_B
A aaa -
B bbb -
B www -
C ccc ccc
C ccc yyy
C xxx ccc
C xxx yyy

SQLと同様、キーが重複している場合は重複して結合します。

まとめ

Joinの種類 実行結果 イメージ
Inner Join 両方のテーブルで結合キーが一致するレコードだけを取得する
SQL文におけるInner Join(内部結合)と同じ
Inner_Join.png
Left Join 左テーブルは全件取得する
右テーブルは結合したレコードのみ取得する
ひもづかないレコードはNullを表示する
SQL文におけるLeft Join(左外部結合)と同じ
Left_Join.png
Right Join 右テーブルは全件取得する
左テーブルは結合したレコードのみ取得する
ひもづかないレコードはNullを表示する
SQL文におけるRight Join(右外部結合)と同じ
Right_Join.png
Outer Join
もしくはJoin
両方のテーブルで結合キーが一致するレコードに加え、結合キーが一致しないレコードも表示する
ひもづかないレコードはNullを表示する
SQL文におけるFull Join(完全外部結合)と同じ
Outerは省略できる
Outer_Join.png
結合キーについて 実行結果 イメージ
結合キーがない場合 左テーブルの全行に対して右テーブルの全行をつけて表示する
SQL文におけるCross Join(交差結合)と同じ
結合キーがないため、Joinの種類にかかわらずすべて同じ結果となる
Cross_Join.png
結合キーが重複している場合 SQLと同様、キーが重複している場合は重複して結合する duplication.png
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1