# Join と Keep を使用したテーブルの結合

結合とは 2 つのテーブルを 1 つにまとめる操作です。結合により生成されるテーブルのレコードは元のテーブルのレコードを組み合わせたもので、通常、生成されたテーブル内の特定の組み合わせに関係する 2 つのレコードが 1 つ以上の共通項目に共通の値を持っています。そのため、これを「自然結合」と呼びます。Qlik Sense では、結合はスクリプトで実行され、論理テーブルが作成されます。

スクリプト内で事前にテーブルを結合することができます。その場合、Qlik Sense ロジックは、個々のテーブルではなく、結合の結果である単一の内部テーブルを処理するようになります。この処理が必要な場合もありますが、次のような欠点があります。

* ロードされたテーブルのサイズが大きくなり、Qlik Sense の動作が遅くなることがあります。
* 元のテーブル内のレコード数を取得できなくなり、情報の一部が失われる可能性があります。

Keep 機能は、Qlik Sense にテーブルを保存する前に、2 つのテーブルの片方または両方をテーブル データの共通部分に縮小させる効果を持ち、明示的な参加を使用する必要がある場合の数を減らすために設計されています。

情報メモこのマニュアルでは、結合という用語は、内部テーブルが作成される前に行われる結合という意味で使用されています。しかし、内部テーブルが作成された後で行われる関連付けも、基本的には結合です。

## Join

結合を作成する最も簡単な方法は、スクリプトで Join プレフィックスを使用することです。これは、内部テーブルを別の名前のテーブルまたは最後に作成されたテーブルに結合します。この結合は外部結合になり、2 つのテーブルからのすべての可能な値の組み合わせを作成します。

```
LOAD  a, b, c from table1.csv;
join LOAD a, d from table2.csv;
```

その結果の内部テーブルには、項目 a、b、c、d が含まれています。レコード数は、2 つのテーブルの項目値によって異なります。

情報メモ結合される項目の名前は、完全に同じである必要があります。結合される項目数は任意です。通常、テーブルには 1 つまたは複数の共通する項目があります。共通する項目が 1 つもない場合、テーブルのデカルト積は生成されません。すべての項目が共通することも考えられますが、通常これは意味がありません。Join ステートメントで、先にロードされたテーブルの名前が指定されていない限り、Join プレフィックスは最後に作成されたテーブルを使用します。そのため、2 つのステートメントの順序を任意に指定することはできません。

詳細については、「[Join](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)」を参照してください。

## Join の使用

Qlik Sense スクリプト言語における明示的な Join プレフィックスは、2 つのテーブルの完全な結合を実行します。その結果、1 つのテーブルが生成されます。このような結合を行うと、テーブルが非常に大きくなることがよくあります。

次の手順を実行します。

1. Advanced Scripting Tutorial (高度なスクリプト チュートリアル) のアプリケーションを開きます。

2. データ ロード エディターで新しいスクリプト セクションを追加します。

3. このセクションを Transactions と呼びます。

4. 右のメニューの [DataFiles] で、[データを選択] をクリックします。

5. Transactions.csv をアップロードして選択します。

   ヒント メモ[項目名] で [埋め込まれた項目名] が選択されていることを確認します。このオプションが選択されていると、データをロードする際にテーブルの項目名が含まれます。

6. [データの選択元] ウィンドウで、 [追加] をクリックします。

7. Salesman.xlsx をアップロードして選択します。

8. [データの選択元] ウィンドウで、 [追加] をクリックします。

   これで、スクリプトは次のようになります。

   ```
   LOAD
       "Transaction ID",
       "Salesman ID",
       Product,
       "Serial No",
       "ID Customer",
       "List Price",
       "Gross Margin"
   FROM [lib://DataFiles/Transactions.csv]
   (txt, codepage is 28591, embedded labels, delimiter is ',', msq);

   LOAD
   "Salesman ID",
   Salesman,
   "Distributor ID"
   FROM [lib://DataFiles/Salesman.xlsx]
   (ooxml, embedded labels, table is Salesman);
   ```

9. [データのロード] をクリックします。

10. [データ モデル ビューア] を開きます。データ モデルは次のようになります。

    データ モデル:Transactions、Salesman、および Product テーブル

    データ モデル:Transactions、Salesman、および Product テーブル

    データ モデル:TransactionsTransactions、SalesmanSalesman、および ProductProduct テーブル ![データ モデル、Transactions 、Salesman、Product の各テーブル。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Join1.png)

ただし、Transactions と Salesman のテーブルを分離すると、必要な結果が得られないことがあります。この 2 つのテーブルは結合した方がよいでしょう。

次の手順を実行します。

1. 結合したテーブルの名前を設定するには、最初の LOAD ステートメントの上に次の行を追加します。
   ```
   Transactions:
   ```
2. Transactions と Salesman テーブルを結合するには、2 番目の LOAD ステートメントの上に次の行を追加します。
   ```
   Join(Transactions)
   ```

   これで、スクリプトは次のようになります。
   ```
   Transactions:
   LOAD
       "Transaction ID",
       "Salesman ID",
       Product,
       "Serial No",
       "ID Customer",
       "List Price",
       "Gross Margin"
   FROM [lib://DataFiles/Transactions.csv]
   (txt, codepage is 28591, embedded labels, delimiter is ',', msq);

   Join(Transactions)
   LOAD
       "Salesman ID",
       Salesman,
       "Distributor ID"
   FROM [lib://DataFiles/Salesman.xlsx]
   (ooxml, embedded labels, table is Salesman);
   ```
3. [データのロード] をクリックします。
4. [データ モデル ビューア] を開きます。データ モデルは次のようになります。

   データ モデル: Transactions および Product テーブル

   データ モデル: Transactions および Product テーブル

   データ モデル: TransactionsTransactions および ProductProduct テーブル ![結合後のデータ モデル。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Join2.png)

   これで Transactions および Salesman テーブルのすべての項目が、単一の Transactions テーブルに結合されました。

情報メモJoin を使用するタイミングの詳細については、Qlik Community の次のブログ記事を参照してください。[To Join or not to Join (結合するまたは結合しない)](https://community.qlik.com/t5/Qlik-Design-Blog/To-Join-or-not-to-Join/ba-p/1463102)、[Mapping as an Alternative to Joining (結合の代替としてのマッピング)](https://community.qlik.com/t5/Qlik-Design-Blog/Mapping-as-an-Alternative-to-Joining/bc-p/1473459)。 動作は QlikView の状況に応じて説明されていますが、ロジックは Qlik Sense にもそのまま当てはまります。

## Keep

Qlik Sense の主な機能の 1 つは、テーブルを結合する代わりにテーブル間に関連付けを作成できることです。これにより、メモリの使用量が削減され、速度が向上し、柔軟性が大幅に高まります。Keep の機能は、明示的な結合の使用回数を減らす目的で設計されています。

2 つの LOAD または SELECT ステートメント間の Keep プレフィックスは、Qlik Sense にテーブルが保存される前に、2 つのテーブルの片方または両方をテーブル データの共通部分に縮小させます。Keep プレフィックスの前には、Inner、Left、または Right のいずれかのキーワードを置く必要があります。テーブルからのレコードの選択は、対応する結合と同じ方法で行われます。ただし、2 つのテーブルは結合されず、個別のテーブルとしてそれぞれ異なる名前で Qlik Sense に保存されます。

詳細については、「[Keep](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Keep.htm)」を参照してください。

## Inner

データ ロード スクリプトの Join および Keep プレフィックスの前に、プレフィックス Inner を置くことができます。

Join の前に使用すると、2 つのテーブル間の結合が内部結合であると指定されます。結果のテーブルには、両方のテーブルのすべてのデータ セットのうち、2 つのテーブル間で共通するものだけが含まれます。

Keep の前に使用すると、Qlik Sense に保存される前に、2 つのテーブルは互いの共通部分に縮小されます。

これらの例では、Table1 と Table2 のソース テーブルを使用しています。

これらはあくまで例です。Qlik Sense で行う付随する演習はありません。

Table 1

| A | B |
| --- | --- |
| 1 | aa |
| 2 | cc |
| 3 | ee |

Table2

| A | C |
| --- | --- |
| 1 | xx |
| 4 | yy |

### Inner Join

まず、これらのテーブルで Inner Join を実行すると、VTable が作成されます。このテーブルには 2 つのテーブルのデータを結合した結果、1 行だけ、両方のテーブルに存在するレコードだけが表示されます。

VTable: SELECT \* from Table1; inner join SELECT \* from Table2;

VTable

| A | B | C |
| --- | --- | --- |
| 1 | aa | xx |

### Inner Keep

それに対して、Inner Keep を実行すると、2 つのテーブルが残ります。これらの 2 つのテーブルは、共通項目 A を介して関連付けられます。

VTab1: SELECT \* from Table1; VTab2: inner keep SELECT \* from Table2;

VTab1

| A | B |
| --- | --- |
| 1 | aa |

VTab2

| A | C |
| --- | --- |
| 1 | xx |

詳細については、「[Inner](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Inner.htm)」を参照してください。

## Left

データ ロード スクリプトの Join および Keep プレフィックスの前に、プレフィックス left を置くことができます。

Join の前に使用すると、2 つのテーブル間の結合が左結合であると指定されます。結果のテーブルには、1 つ目のテーブルのすべてのデータ セットと 2 つのテーブルの共通するものだけが含まれます。

Keep の前に使用すると、Qlik Sense に保存される前に、2 つ目のテーブルが 1 つ目のテーブルとの共通部分に縮小されます。

これらの例では、Table1 と Table2 のソース テーブルを使用しています。

Table1

| A | B |
| --- | --- |
| 1 | aa |
| 2 | cc |
| 3 | ee |

Table2

| A | C |
| --- | --- |
| 1 | xx |
| 4 | yy |

まず、これらのテーブルで Left Join を実行すると、VTable が生成されます。このテーブルには、Table1 のすべての行に加え、Table2 の一致行の項目が含まれています。

VTable: SELECT \* from Table1; left join SELECT \* from Table2;

VTable

| A | B | C |
| --- | --- | --- |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |

それに対して、Left Keep を実行すると、2 つのテーブルが残ります。これらの 2 つのテーブルは、共通項目 A を介して関連付けられます。

VTab1: SELECT \* from Table1; VTab2: left keep SELECT \* from Table2;

VTab1

| A | B |
| --- | --- |
| 1 | aa |
| 2 | cc |
| 3 | ee |

VTab2

| A | C |
| --- | --- |
| 1 | xx |

詳細については、「[Left](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Left.htm)」を参照してください。

## Right

Qlik Sense スクリプト言語内の Join および Keep プレフィックスの前に、プレフィックス right を置くことができます。

Join の前に使用すると、2 つのテーブル間の結合が右結合であると指定されます。結果のテーブルには、2 つ目のテーブルのすべてのデータと 2 つのテーブルで共通するものだけが含まれます。

Keep の前に使用すると、Qlik Sense に保存される前に、1 つ目のテーブルが 2 つ目のテーブルとの共通部分に縮小されます。

これらの例では、Table1 と Table2 のソース テーブルを使用しています。

Table1

| A | B |
| --- | --- |
| 1 | aa |
| 2 | cc |
| 3 | ee |

Table2

| A | C |
| --- | --- |
| 1 | xx |
| 4 | yy |

まず、これらのテーブルで Right Join を実行すると、VTable が生成されます。このテーブルには、Table2 のすべての行に加え、Table1 の一致行の項目が含まれています。

VTable: SELECT \* from Table1; right join SELECT \* from Table2;

VTable

| A | B | C |
| --- | --- | --- |
| 1 | aa | xx |
| 4 | - | yy |

それに対して、Right Keep を実行すると、2 つのテーブルが残ります。これらの 2 つのテーブルは、共通項目 A を介して関連付けられます。

VTab1: SELECT \* from Table1; VTab2: right keep SELECT \* from Table2;

VTab1

| A | B |
| --- | --- |
| 1 | aa |

VTab2

| A | C |
| --- | --- |
| 1 | xx |
| 4 | yy |

詳細については、「[Right](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Right.htm)」を参照してください。