2022年12月24日土曜日

SQLite3 FULL JOIN (完全外部結合)について

概要

SQLite ver3.39.0 からFULL JOIN(FULL OUTER JOIN)が利用可能になった。 なお、結合できなかった部分はnullになる。

実行例

user_id mail_address last_login 0001 userA@example.com 2022-12-01 0002 userB@example.com 2022-12-09 0003 userC@example.com 2022-12-11 siteA_user user_id mail_address last_login X001 userB@example.com 2022-11-28 Y002 userD@example.com 2022-12-04 Z003 userC@example.com 2022-12-08 FULL JOIN siteB_user siteA_last_login SiteA_mail_address siteB_mail_address siteB_last_login 2022-12-01 userA@example.com 2022-12-09 userB@example.com userB@example.com 2022-11-28 2022-12-11 userC@example.com userC@example.com 2022-12-08 userD@example.com 2022-12-04
                    
select
    A.last_login    as siteA_last_login
    , A.mail_address    as siteA_mail_address
    , B.mail_address  as siteB_mail_address
    , B.last_login    as siteB_last_login
from
    siteA_user A
    full join 
        siteB_user B
        on
            A.mail_address = B.mail_address
;
                    
                
環境
  • Windows 10 64bit
  • SQLite3 (3.39.2) Command-Line Shell
                    
sqlite> .nullvalue [null]
sqlite> .mode box
sqlite> select * from siteA_user;
┌─────────┬───────────────────┬────────────┐
│ user_id │   mail_address    │ last_login │
├─────────┼───────────────────┼────────────┤
│ 0001    │ userA@example.com │ 2022-12-01 │
│ 0002    │ userB@example.com │ 2022-12-09 │
│ 0003    │ userC@example.com │ 2022-12-11 │
└─────────┴───────────────────┴────────────┘
sqlite> select * from siteB_user;
┌─────────┬───────────────────┬────────────┐
│ user_id │   mail_address    │ last_login │
├─────────┼───────────────────┼────────────┤
│ X001    │ userB@example.com │ 2022-11-28 │
│ Y002    │ userD@example.com │ 2022-12-04 │
│ Z003    │ userC@example.com │ 2022-12-08 │
└─────────┴───────────────────┴────────────┘
sqlite> select
   ...>      A.last_login    as siteA_last_login
   ...>      , A.mail_address    as siteA_mail_address
   ...>      , B.mail_address  as siteB_mail_address
   ...>      , B.last_login    as siteB_last_login
   ...> from
   ...>      siteA_user A
   ...>      full join
   ...>          siteB_user B
   ...>          on
   ...>              A.mail_address = B.mail_address
   ...> ;
┌──────────────────┬────────────────────┬────────────────────┬──────────────────┐
│ siteA_last_login │ siteA_mail_address │ siteB_mail_address │ siteB_last_login │
├──────────────────┼────────────────────┼────────────────────┼──────────────────┤
│ 2022-12-01       │ userA@example.com  │ [null]             │ [null]           │
│ 2022-12-09       │ userB@example.com  │ userB@example.com  │ 2022-11-28       │
│ 2022-12-11       │ userC@example.com  │ userC@example.com  │ 2022-12-08       │
│ [null]           │ [null]             │ userD@example.com  │ 2022-12-04       │
└──────────────────┴────────────────────┴────────────────────┴──────────────────┘
                    
                

参考URL