こんな感じに非正規化されてデータが格納されているテーブルがあったとします。
fruit_en | furuits_ja |
---|---|
["apple", "pear", "mandarin"] | ["林檎", "梨", "蜜柑"] |
このテーブルを以下のように変換するにはどうしたら、よいでしょうか?
fruit_en | furuits_ja |
---|---|
"apple" | "林檎" |
"pear" | "梨" |
"mandarin" | "蜜柑" |
失敗例: ,
でJOINする
とりあえずのカンで以下のクエリを書きましたが、失敗しました。
with data as (
select ["apple", "pear", "mandarin"] as fruit_en, ["林檎", "梨", "蜜柑"] as fruit_ja
)
select fruit_en, fruit_ja from data, unnest(data.fruit_en) as fruit_en, unnest(data.fruit_ja) as fruit_ja
結果
fruit_en | fruit_ja |
---|---|
apple | 林檎 |
apple | 梨 |
apple | 蜜柑 |
pear | 林檎 |
pear | 梨 |
pear | 蜜柑 |
mandarin | 林檎 |
mandarin | 梨 |
mandarin | 蜜柑 |
これは ,
によるJOINがCROSS JOINなための挙動です。
正解
with offset句を使うことで、配列のINDEXを出力し、その情報を使ってJOINすることによって配列のzipを行います。
select fruit_en, fruit_ja from
(select fruit_en , offset from data, unnest(data.fruit_en) as fruit_en with offset as offset) join
(select fruit_ja , offset from data, unnest(data.fruit_ja) as fruit_ja with offset as offset)
using(offset)