見出し画像

Tableau のリレーションシップ機能 その3~ 完全外部結合 ~

前回は、リレーションシップは、ワークシートのフィールドの配置によって、結合の種類が変わること、集計が行われない場合は内部結合 (INNER JOIN) が行われ、集計が行われた場合は左結合 (LEFT JOIN) が行われていことを説明しました。(右結合 (RIGHT JOIN) がないのは、主テーブルが入れ替わるので、右結合と同じことを左結合で行っているということです)。では、集計する値が両方のテーブルにある場合はどうなのでしょう? 実験を続けます。

前回の最後の結果 (C_AGE の集計) に、T_QTYの集計を加えてみて下さい。
結果は次のようになります。

集計する数値が両方のテーブルにある場合

完全外部結合と同じ状態になります。リレーションシップでは、フィールドの配置によって、完全外部結合も行うことが出来ます。今回も SQL で確認してみましょう。

一つ目のクエリー
二つ目のクエリー

FULL JOIN が使われているものと思ったら、なんと、2つのクエリーが別々に実行されていました。前回実験した LEFT JOIN のクエリーが二本走ってました。この二つのクエリーを結合するクエリーはDB側では走っていないので、取得した結果を Tableau内部で結合して結果を表示しているものと思われます。Tableauで何が起こっているのか、パフォーマンスモニターで確認したのですが、よく解りませんでした。しかし、別々に LEFT JOIN してマージするというのは納得ですし、ここにリレーションシップの旨味があることが解りました。即ち、個々に集計してから結合が出来るわけです。この点も後に触れていきたいと思います。

これまで2つのテーブルのフィールドを使用してきましたが、個々のテーブルのフィールドだけを使用したらどうなるかを実験してみましょう。

TRN__01 にあるフィールドだけを使用してみた結果が以下です。

TRAN_01 のフィールドだけを使用
SQL

もちろん正しく集計が行われています。そして SQLをみると CST_01 との結合は行われておらず、TRAN_01 だけでクエリーが実行されています。

CST__01 にあるフィールドだけを使用してみた結果が以下です。

CST_01 のフィールドだけを使用
SQL

こちらも同様です。

このことから、リレーションシップは、データ接続画面でリレーションの定義が行われていても、実際に使うテーブルしかクエリーで使われていないことが解ります。これはリレーションの素晴らしい所です。従来の結合では、ディメンションに配置した時の集約・集計 (GROUP BY)  や、フィルターは、結合後に発生します。リレーションシップは、テーブルの関係性を保ちながらも、その時必要なテーブルに対して集計やフィルターが出来る訳です。これはデータが少ない時にはあまり違いが出ませんが、データが大量になってくるとパフォーマンスに大きく影響することを意味します。

徐々にリレーションシップと結合の違いが見えてきたのではないでしょうか? 次回は、これらを踏まえて、リレーションシップの仕組みをレビューしていきたいと思います。

だんだん深い話になってきましたので、ご質問、ご意見等ございましたら遠慮なく、コメント欄、または Twitter等でお知らせください。


この記事が気に入ったらサポートをしてみませんか?