Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
2つ以上のテーブルをINNER JOIN / KEEP する際の質問です。
// Table A(トランザクション)
TableA:
Load a,
b,
c
From...;
// Table B(企業マスター)
INNER KEEP // or INNER JOIN
Load a,
D
From ...;
// Table C(顧客マスター)
INNER KEEP // or INNER JOIN
Load b,
E
From ...;
上記の様に2つ以上のテーブルをINNER KEEP(or INNER JOIN)した時、[Table B]は確かにINNER KEEP(or INNER JOIN)されるのですが、[Table C]のINNER KEEP(or INNER JOIN)が効いていないように見えます。
→Table Aに含まれないデータが読み込まれてしまう
2つ以上のテーブルを「厳密」にINNER KEEP(or INNER JOIN)したいのですが、QlikViewでは実現不可能なのでしょうか?
例えば上記の例ですと、Table A(トランザクション)に企業/顧客のマスターデータを連結させた時、
企業/顧客データのリストボックスからTable A(トランザクション)に無いデータを除外されることが目的です。
→企業マスターのリストボックス/顧客マスターのリストボックスの何を選んでも、必ずトランザクションが存在する状態にしたい
inner join と inner keep は処理内容は同じようにみえますが、3つ以上のテーブルで行う場合は変わってきます。
先程記述したとおり、inner joinではテーブルをひとつにするので、最初に実施したinner joinによる絞込が、最後まで有効になりますが、inner keepはテーブルが分かれるので、対象となるひとつのテーブルとのinner処理しか反映されません。
記述されている内容だと、テーブル「Sheet3」を取り込む際は、「Sheet2」に対してのinner 処理がかかり双方のデータが絞り込みが実施されますが、「Sheet1」への反映は行われません。
「Sheet1」へも絞込後の「Sheet2」の結果を再反映させるには、以下のような記述の追加が必要になります。
INNER KEEP (Sheet1)
Sheet2.1:
LOAD *
Resident Sheet2;
DROP Table Sheet2;
テーブル取り込みごとに実施されているKeepとJoinの違いを添付しておきます。
各テーブル取り込みごとに削除となるデータをグレーにしています。
記述内容から判断すると、テーブルをひとつにまとめたいのかと思うので、'Inner Join' で出来ると思います。
'Inner Keep' はJoinとは違い、連携するデータだけをテーブルに残す動作で、各テーブルはそのまま残ります。
(テーブルビューアーで確認してみて下さい)
記述されているスクリプトですと、Table Bを'Inner Keep'する際は、TableAとのキー項目 'a' が存在するので、'Inner' が働いています。
Table Cの場合は、直前に記述されているTable Bに連携項目が無いので、データの絞り込みが実施されません。
この場合、
Inner Keep (TableA)
と記述すると、既にTable BとのKeepで絞り込まれたTableAとのKeep処理が実施されます。
これにより、TableAにはBとCとのKeepによるデータ絞込が実施された事になりますが、TableBは、このTableCとの絞込実施後のTableAの結果は反映されませんので注意して下さい。
Joinとの使い分けですが、一概には言えないのですが、Joinするとデータ量が多くなってしまい、QVの動作が重くなるケースがあります。
Keepの場合は、テーブルは別で存在する事になるので、データ量が増えるといった事は無く、個人的な経験では、Joinしてしまうよりも動作が軽いように思います。
「テーブルを分けたまま、不要データを削除する」といった目的で利用されれば良いと思います。
なるほど。
「直前のテーブルに対して実行する」ので、直前のテーブルに項目が無ければ
テーブル名を指定してあげるんですね。
目的は、QlikViewはNULLの扱いが苦手のようなので、Loadスクリプトの段階で特定項目がNULLのデータをINNER JOINすることで除外してしまおうとしています。
例えば3つのテーブルで以下のような同じキーを使っている場合は想定通りの動きをします。
Table A(-XXは項目名)
- ID
- Value
Table B
- ID
- Value2
Table C
- ID
- Value3
しかし、以下のようなJOINを試みると、INNER JOINで本来は「片方にしか存在しない」ために削除されるはずのデータが残ってしまいます。
Table A
- ID
- Value
- ValueOther
Table B
- ID
- Value2
Table C
- Value2
- Value3
Table D
- Value 3
- Value 4
追記です。
前述の添付のサンプルですと、INNER JOINとINNER KEEPの挙動も異なるようです。
→INNER KEEP、INNER JOINの違いは単にオリジナルのテーブルを残すかどうかのみで、結果のデータに差異は無いと思ってたんですが・・・
この当たりの動きが分かるヒントになるような文献等、ご存知でしょうか?
inner join と inner keep は処理内容は同じようにみえますが、3つ以上のテーブルで行う場合は変わってきます。
先程記述したとおり、inner joinではテーブルをひとつにするので、最初に実施したinner joinによる絞込が、最後まで有効になりますが、inner keepはテーブルが分かれるので、対象となるひとつのテーブルとのinner処理しか反映されません。
記述されている内容だと、テーブル「Sheet3」を取り込む際は、「Sheet2」に対してのinner 処理がかかり双方のデータが絞り込みが実施されますが、「Sheet1」への反映は行われません。
「Sheet1」へも絞込後の「Sheet2」の結果を再反映させるには、以下のような記述の追加が必要になります。
INNER KEEP (Sheet1)
Sheet2.1:
LOAD *
Resident Sheet2;
DROP Table Sheet2;
テーブル取り込みごとに実施されているKeepとJoinの違いを添付しておきます。
各テーブル取り込みごとに削除となるデータをグレーにしています。
なるほど。
資料もありがとうございます。分かりやすかったです。
JOINとKEEPの挙動の違いが、単にテーブルを残すかどうかだけではないという事が分かったことは収穫です。
その先入観無しで考えれば、動きは納得の挙動です。