Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
mokitsu61
Creator
Creator

2つ以上のテーブルのINNER KEEP、INNER JOIN

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(トランザクション)に無いデータを除外されることが目的です。

→企業マスターのリストボックス/顧客マスターのリストボックスの何を選んでも、必ずトランザクションが存在する状態にしたい

Labels (1)
1 Solution

Accepted Solutions
kentaroWakamatsu
Creator II
Creator II

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の違いを添付しておきます。

各テーブル取り込みごとに削除となるデータをグレーにしています。


View solution in original post

5 Replies
kentaroWakamatsu
Creator II
Creator II

記述内容から判断すると、テーブルをひとつにまとめたいのかと思うので、'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してしまうよりも動作が軽いように思います。

「テーブルを分けたまま、不要データを削除する」といった目的で利用されれば良いと思います。


mokitsu61
Creator
Creator
Author

なるほど。

「直前のテーブルに対して実行する」ので、直前のテーブルに項目が無ければ

テーブル名を指定してあげるんですね。

目的は、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

mokitsu61
Creator
Creator
Author

追記です。

前述の添付のサンプルですと、INNER JOINとINNER KEEPの挙動も異なるようです。

→INNER KEEP、INNER JOINの違いは単にオリジナルのテーブルを残すかどうかのみで、結果のデータに差異は無いと思ってたんですが・・・

この当たりの動きが分かるヒントになるような文献等、ご存知でしょうか?

kentaroWakamatsu
Creator II
Creator II

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の違いを添付しておきます。

各テーブル取り込みごとに削除となるデータをグレーにしています。


mokitsu61
Creator
Creator
Author

なるほど。

資料もありがとうございます。分かりやすかったです。

JOINとKEEPの挙動の違いが、単にテーブルを残すかどうかだけではないという事が分かったことは収穫です。

その先入観無しで考えれば、動きは納得の挙動です。