Join と Keep を使用したテーブルの結合
結合とは 2 つのテーブルを 1 つにまとめる操作です。結合により生成されるテーブルのレコードは元のテーブルのレコードを組み合わせたもので、通常、生成されたテーブル内の特定の組み合わせに関係する 2 つのレコードが 1 つ以上の共通項目に共通の値を持っています。そのため、これを「自然結合」と呼びます。Qlik Sense では、結合はスクリプトで実行され、論理テーブルが作成されます。
スクリプト内で事前にテーブルを結合することができます。その場合、Qlik Sense ロジックは、個々のテーブルではなく、結合の結果である単一の内部テーブルを処理するようになります。この処理が必要な場合もありますが、次のような欠点があります。
- ロードされたテーブルのサイズが大きくなり、Qlik Sense の動作が遅くなることがあります。
- 元のテーブル内のレコード数を取得できなくなり、情報の一部が失われる可能性があります。
Keep 機能は、Qlik Sense にテーブルを保存する前に、2 つのテーブルの片方または両方をテーブル データの共通部分に縮小させる効果を持ち、明示的な参加を使用する必要がある場合の数を減らすために設計されています。
SQL SELECT ステートメント内で結合
ODBC ドライバを使用して、SELECT ステートメント内で結合を作成できます。これは、Join プレフィックスを使用した結合とほぼ同じです。
ただし、ほとんどの ODBC ドライバは、完全な (双方向) 外部結合を作成できません。これらのドライバで作成できるのは、左または右外部結合に限られます。左 (右) 外部結合には、左 (右) テーブルに結合キーが存在する組み合わせだけが含まれますが、完全な外部結合にはすべての組み合わせが含まれます。Qlik Sense は、自動的に完全な外部結合を作成します。
また、SELECT ステートメントによる結合は、Qlik Sense で作成する結合よりもはるかに複雑です。
SELECT DISTINCTROW
[Order Details].ProductID, [Order Details].
UnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID
FROM Orders
RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;
この SELECT ステートメントは、架空の会社への注文 (Orders) を含むテーブルを、注文詳細 (Order Details) を含むテーブルに結合します。これは右外部結合で、OrderDetails のすべてのレコードに加え、Orders テーブルに存在しない OrderID を持つレコードも含まれています。ただし、Orders に存在しても、OrderDetails に存在しない注文は含まれていません。
Join
結合を作成する最も簡単な方法は、スクリプトで Join プレフィックスを使用することです。これは、内部テーブルを別の名前のテーブルまたは最後に作成されたテーブルに結合します。この結合は外部結合になり、2 つのテーブルからのすべての可能な値の組み合わせを作成します。
LOAD a, b, c from table1.csv;
join LOAD a, d from table2.csv;
その結果の内部テーブルには、項目 a、b、c、d が含まれています。レコード数は、2 つのテーブルの項目値によって異なります。
詳細については、「Join」を参照してください。
Keep
データ ロード スクリプトにおける明示的な Join プレフィックスは、2 つのテーブルの完全な結合を実行します。その結果、1 つのテーブルが生成されます。多くの場合、このような結合からは、かなり大きなテーブルが作成されます。Qlik Sense の主な機能の 1 つは、テーブルを結合する代わりにテーブル間に関連付けを作成できることです。これにより、メモリの使用量が削減され、速度が向上し、柔軟性が大幅に高まります。keep の機能は、明示的な結合の使用回数を減らす目的で設計されています。
2 つの LOAD または SELECT ステートメント間の Keep プレフィックスは、Qlik Sense にテーブルが保存される前に、2 つのテーブルの片方または両方をテーブル データの共通部分に縮小させます。Keep プレフィックスの前には、Inner、Left、または Right のいずれかのキーワードを置く必要があります。テーブルからのレコードの選択は、対応する結合と同じ方法で行われます。ただし、2 つのテーブルは結合されず、個別のテーブルとしてそれぞれ異なる名前で Qlik Sense に保存されます。
詳細については、「Keep」を参照してください。
Inner
データ ロード スクリプトの Join および Keep プレフィックスの前に、プレフィックス Inner を置くことができます。
Join の前に使用すると、2 つのテーブル間の結合が内部結合であると指定されます。結果のテーブルには、両方のテーブルのすべてのデータ セットのうち、2 つのテーブル間で共通するものだけが含まれます。
Keep の前に使用すると、Qlik Sense に保存される前に、2 つのテーブルは互いの共通部分に縮小されます。
これらの例では、Table1 と Table2 のソース テーブルを使用しています。
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Inner Join
まず、これらのテーブルで Inner Join を実行すると、VTable が作成されます。このテーブルには 2 つのテーブルのデータを結合した結果、1 行だけ、両方のテーブルに存在するレコードだけが表示されます。
VTable:
SELECT * from Table1;
inner join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
Inner Keep
それに対して、Inner Keep を実行すると、2 つのテーブルが残ります。これらの 2 つのテーブルは、共通項目 A を介して関連付けられます。
VTab1:
SELECT * from Table1;
VTab2:
inner keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
詳細については、「Inner」を参照してください。
Left
データ ロード スクリプトの Join および Keep プレフィックスの前に、プレフィックス left を置くことができます。
Join の前に使用すると、2 つのテーブル間の結合が左結合であると指定されます。結果のテーブルには、1 つ目のテーブルのすべてのデータ セットと 2 つのテーブルの共通するものだけが含まれます。
Keep の前に使用すると、Qlik Sense に保存される前に、2 つ目のテーブルが 1 つ目のテーブルとの共通部分に縮小されます。
これらの例では、Table1 と Table2 のソース テーブルを使用しています。
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
まず、これらのテーブルで Left Join を実行すると、VTable が生成されます。このテーブルには、Table1 のすべての行に加え、Table2 の一致行の項目が含まれています。
VTable:
SELECT * from Table1;
left join SELECT * from Table2;
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;
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
詳細については、「Left」を参照してください。
Right
データ ロード スクリプトの Join および Keep プレフィックスの前に、プレフィックス right を置くことができます。
Join の前に使用すると、2 つのテーブル間の結合が右結合であると指定されます。結果のテーブルには、2 つ目のテーブルのすべてのデータと 2 つのテーブルで共通するものだけが含まれます。
Keep の前に使用すると、Qlik Sense に保存される前に、1 つ目のテーブルが 2 つ目のテーブルとの共通部分に縮小されます。
これらの例では、Table1 と Table2 のソース テーブルを使用しています。
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
まず、これらのテーブルで Right Join を実行すると、VTable が生成されます。このテーブルには、Table2 のすべての行に加え、Table1 の一致行の項目が含まれています。
VTable:
SELECT * from Table1;
right join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
4 | - | yy |
それに対して、Right Keep を実行すると、2 つのテーブルが残ります。これらの 2 つのテーブルは、共通項目 A を介して関連付けられます。
VTab1:
SELECT * from Table1;
VTab2:
right keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
4 | yy |
詳細については、「Right」を参照してください。