UNION ALL 語法其實有陷阱?介紹 BigQuery 最新的 UNION ALL BY NAME

  1. SQL 中的 UNION ALL 其實有陷阱?
  2. UNION ALL 實際上會造成什麼問題?
  3. BigQuery 新功能 – UNION ALL BY NAME
  4. 總結
  5. 補充資料 – CORRESPONDING 語法
  6. 參考資料

SQL 中的 UNION ALL 其實有陷阱?

在查詢結構化資料庫時,常會使用到一個 SQL 語法:UNION ALL,但其實這個語法背後有一個很大的坑,就是在合併資料時,UNION ALL 其實會按照 SELECT 的順序來合併 (Positional 特性) ,所以當欄位資料型態一樣時,資料就會無視欄位名稱被按照順序合併起來。

按照順序來合併資料是什麼意思呢?
讓我們看一下範例

UNION ALL 實際上會造成什麼問題?

在這個範例中,我們想要讓名稱為 NumberEmoji 分別 UNION 在各自的欄位,由於這些值都是字串型態,所以 UNION ALL 是會成功執行的,但我們會發現結果並不是我們想要的那樣,因為我們的 SQL 中 SELECT 欄位的順序是錯的,UNION ALL 並不會自動幫我們依據欄位名稱去合併,這個問題除了 BigQuery 之外,其他資料庫像是 MySQL 或 PostgreSQL 也會有一樣的情況

BigQuery 新功能 – UNION ALL BY NAME

因此,近期 BigQuery 出了一個新功能 UNION ALL BY NAME,官方的說明就是表示我們可以使用欄位名稱來做資料合併

BY NAME or CORRESPONDING
Use the BY NAME or CORRESPONDING modifier with set operations to match columns by name instead of by position.

讓我們看一下更改後的範例 ⬇️

在原本的查詢的 UNION ALL 後面加上 BY NAME,就可以得到我們真正想要的查詢結果囉!

總結

在資料量大、欄位又多的情況下,原本的 UNION ALL 有時候還是會讓人擔憂資料品質,有了 BY NAME 這個方法就方便很多,只要平常在做 UNION ALL 時有仔細地確認欄位名稱 Alias,就能放心使用 BY NAME 去合併資料欄位了!

希望將來其他的資料庫也能引進這個語法!


補充資料 – CORRESPONDING 語法

除了 BY NAME 之外還有一個 CORRESPONDING 的語法,但這個語法跟 BY NAME 基本上是互通的,以下是官方提供的對照表:


參考資料

發表留言