今回はBigQueryにおけるUNION ALLとUNION DISTINCTの違いについて。
2つのテーブルをユニオンしたい時に UNION ALL を指定する場合と UNION DISTINCT を指定する場合でデータがどう変わるのか?
上記について私がSQLを学び始めた時は全然わからなかったので、備忘録として整理しておこうと思う。
UNION ALLとUNION DISTINCT の違いは?
UNION ALLとUNION DISTINCTの違いは結論から言うと「重複行を排除するかどうか」の1点だ。
UNION ALLを指定する場合、ユニオン対象の2つのテーブルに重複している行があっても、そのままユニオンする。
一方で、UNION DISTINCT を指定する場合は、重複行はユニオンの結果から除外される。
ちなみにUNION DISTINCTではなく、単にUNIONと指定するだけで重複行を除外してユニオンしてくれるRDBMSも多いが、BigQueryにおいてはUNIONと記載するだけではエラーとなる。
では、具体例でデータがどう変わるかを確認しよう。
テーブルAとテーブルBはそれぞれ5行ずつデータがある。
その内、2行(product_id=004と005の行)は2つのテーブルで重複している。
【テーブルA】
【テーブルB】
UNION ALLの場合
UNION ALLの場合、対象の2つのテーブルに重複行があっても全て結果に含まれる。
上記2つのテーブルをUNION ALLを指定してユニオンした場合のクエリとその結果は下記の通りだ。
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT product_id ,product_name FROM `sample_dataset.sample_table1` UNION ALL SELECT product_id ,product_name FROM `sample_dataset.sample_table2` ; |
UNION ALLを指定した場合、上記赤枠のように完全に重複した行があっても、そのままユニオンしていることがお分かりいただけると思う。
※上記結果は重複がわかりやすいように、product_idの昇順で別途並べ替えている
5行ずつの2つのテーブルをユニオンした結果、合計で10行になっているので除外された行がないことがわかる。
UNION DISTINCTの場合
一方、UNION DISTINCTを指定する場合、重複行はユニオンの結果から除外される。
先ほどと同様の2つのテーブルをUNION DISTINCTを指定してユニオンした場合のクエリとその結果は下記の通りだ。
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT product_id ,product_name FROM `sample_dataset.sample_table1` UNION DISTINCT SELECT product_id ,product_name FROM `sample_dataset.sample_table2` ; |
UNION ALLと時と違い、2つのテーブルで重複していた2行が結果から除外され、テーブル全体の行数が8行になっていることがお分かりいただけると思う。
これがUNION DISTINCTを指定してユニオンした場合の動きとなる。
まとめ
BigQueryにおけるUNION ALLとUNION DISTINCTの違いにおける要点は下記の通りだ。
- UNION ALLとUNION DISTINCTの違いは「重複行を含むかどうか」
- UNION ALLは重複行を含める
- UNION DISTINCTは重複行を結果から除外する
- 他のRDBMSと違い、単にUNION DISTINCTの代わりにUNIONと記載するだけではBigQueryではエラーとなるので、UNION DISTINCTと記載する必要がある
BigQueryに関する他の記事は下記で紹介しているので是非参考にして欲しい。