![見出し画像](https://assets.st-note.com/production/uploads/images/94627883/rectangle_large_type_2_ec272d207c39b00e38cb215684835a0f.png?width=800)
Tableau のリレーションシップ機能 その3~ 完全外部結合 ~
前回は、リレーションシップは、ワークシートのフィールドの配置によって、結合の種類が変わること、集計が行われない場合は内部結合 (INNER JOIN) が行われ、集計が行われた場合は左結合 (LEFT JOIN) が行われていことを説明しました。(右結合 (RIGHT JOIN) がないのは、主テーブルが入れ替わるので、右結合と同じことを左結合で行っているということです)。では、集計する値が両方のテーブルにある場合はどうなのでしょう? 実験を続けます。
前回の最後の結果 (C_AGE の集計) に、T_QTYの集計を加えてみて下さい。
結果は次のようになります。
![](https://assets.st-note.com/img/1672554109767-UMfsZeC5oE.png?width=800)
完全外部結合と同じ状態になります。リレーションシップでは、フィールドの配置によって、完全外部結合も行うことが出来ます。今回も SQL で確認してみましょう。
![](https://assets.st-note.com/img/1672554911795-P2jqW1zX1t.png)
![](https://assets.st-note.com/img/1672554926183-1IpRshqLqo.png)
FULL JOIN が使われているものと思ったら、なんと、2つのクエリーが別々に実行されていました。前回実験した LEFT JOIN のクエリーが二本走ってました。この二つのクエリーを結合するクエリーはDB側では走っていないので、取得した結果を Tableau内部で結合して結果を表示しているものと思われます。Tableauで何が起こっているのか、パフォーマンスモニターで確認したのですが、よく解りませんでした。しかし、別々に LEFT JOIN してマージするというのは納得ですし、ここにリレーションシップの旨味があることが解りました。即ち、個々に集計してから結合が出来るわけです。この点も後に触れていきたいと思います。
これまで2つのテーブルのフィールドを使用してきましたが、個々のテーブルのフィールドだけを使用したらどうなるかを実験してみましょう。
TRN__01 にあるフィールドだけを使用してみた結果が以下です。
![](https://assets.st-note.com/img/1672556917741-lQf9Fvyt2v.png?width=800)
![](https://assets.st-note.com/img/1672557992891-Ads2TR9NdX.png)
もちろん正しく集計が行われています。そして SQLをみると CST_01 との結合は行われておらず、TRAN_01 だけでクエリーが実行されています。
CST__01 にあるフィールドだけを使用してみた結果が以下です。
![](https://assets.st-note.com/img/1672556982354-3By2gYgXen.png?width=800)
![](https://assets.st-note.com/img/1672558247381-MVq96YFm9P.png)
こちらも同様です。
このことから、リレーションシップは、データ接続画面でリレーションの定義が行われていても、実際に使うテーブルしかクエリーで使われていないことが解ります。これはリレーションの素晴らしい所です。従来の結合では、ディメンションに配置した時の集約・集計 (GROUP BY) や、フィルターは、結合後に発生します。リレーションシップは、テーブルの関係性を保ちながらも、その時必要なテーブルに対して集計やフィルターが出来る訳です。これはデータが少ない時にはあまり違いが出ませんが、データが大量になってくるとパフォーマンスに大きく影響することを意味します。
徐々にリレーションシップと結合の違いが見えてきたのではないでしょうか? 次回は、これらを踏まえて、リレーションシップの仕組みをレビューしていきたいと思います。
だんだん深い話になってきましたので、ご質問、ご意見等ございましたら遠慮なく、コメント欄、または Twitter等でお知らせください。
この記事が気に入ったらサポートをしてみませんか?