📝

データ型が異なっていても縦にも横にも結合できる~

2023/06/13に公開

はじめに

SQLで結合する際、on節ではsample_1.id = sample_2.idのように同じデータ型が入ることが想定されると思います。今回はもし、データ型が異なるid(number と varchar)がキーになっていた場合どのような挙動になるのか見ていきたいと思います。(結合できちゃいました)

準備

今回使用するテーブルをサクサクっと作っていきます。
なんの変哲も無いテーブルたちです。
各テーブルの1のデータ型をちょっと変えています。

create or replace table d_harato_db.public.test_1
as
select
    1 as id
    ,1 as foreign_key
;

create or replace table d_harato_db.public.test_2
as
select
    '01'::varchar as pk
    , 'joined' as joined_values
;

create or replace table d_harato_db.public.test_3
as
select
    1 as id
    ,'01'::varchar as foreign_key
;

各テーブルのデータ型も確認しましょう。
意図した通りに作成できていますね。

desc table d_harato_db.public.test_1;

desc table d_harato_db.public.test_2;

desc table d_harato_db.public.test_3;

結合1(left join)

では検証していきます。
まずはtest_1にtest_2を結合します。
キーはtest_1のforeign_key (NUMBER(38,0))とtest_2のpk VARCHAR(16777216)です。

select
    *
    ,unicode(foreign_key)
    ,unicode(pk)
from
    d_harato_db.public.test_1 as test_1
left join
    d_harato_db.public.test_2 as test_2
on
    test_1.foreign_key = test_2.pk

結果。。。

できました!

結合2 (union all, union)

次はunionを見ていきたいと思います。
新たにtest_3を呼び出して、先ほど作成したtest_1に対してunionを行います。

select
    *
from
    d_harato_db.public.test_1
union all
select
    *
from
    d_harato_db.public.test_3

結果。。。

できました!

foreign keyのデータ型を確認するとfix(固定小数点数)となってますね。

最後にunionを行ってみます。(結果は予想できそうですが。。。)

select
    *
from
    d_harato_db.public.test_1
union
select
    *
from
    d_harato_db.public.test_3

できました!

重複行と見做され、1レコードのみが出力されていますね。

最後に

結合する時、裏でよしなに型変換が働いているのでしょうか。

Discussion