Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

【SQL】同じカラム名が存在するテーブル同士の結合

今回はsqlの結合について確認したいことがありましたので、確認結果を残しておきます!!

ある日のこと、、、
同じカラム名を含んだテーブルが乱立した環境を見つけ、
データベース設計出来てないなw。継ぎ足しで開発していった負の遺産かな?
と色々考えを巡らせたのですが、ふと思ったのです。
同じカラム名が含まれたテーブル同士を内部結合、外部結合した時にどうなのか?と!!

同じカラム名なのでどちらかが表示されるのか?
エラーとなってしまうのか?
結合したテーブルのカラムが全表示されるのか?

う~ん。。。とりあえずやってみることにしました!!
まぁ、データベース設計をちゃんと行っていればこんな現象はまず発生しないんですけどねw。

今回はsqliteで定義したテーブルはこちらの通り!!
f:id:Elsammit:20200612100211j:plain

さらに各テーブル毎に保存したレコードはこちら。
※同じカラム名に対しては同じデータが書き込まれるようにレコードを保存いたしました。

sqlite> select * from TableA;
ID          username    pcname      inputdate   pc_carrer
----------  ----------  ----------  ----------  ----------
1           aaa         aa_pc       0611        high
2           bbb         bb_pc       0611        high
3           ccc         cc_pc       0613        low
4           ddd                     0613

sqlite> select * from TableB;
ID          username    phone_name  Maker       phone_carrer
----------  ----------  ----------  ----------  ------------
1           aaa         aa_phone    bbb         low
2           bbb         bb_phone    bbb         low
3           ccc         cc_phone    ccc         low
4           ddd                                 low

sqlite> select * from TableC;
ID          username    pcname      phone_name  pc_carrer   phone_carrer
----------  ----------  ----------  ----------  ----------  ------------
1           aaa         aa_pc       aa_phone    high        low
2           bbb         bb_pc       bb_phone    high        low
3           ccc         cc_pc       cc_phone    low         low

では実際に結合を行ってみます!!

■TableA-TableB間の内部結合
sqlite> select * from TableA inner join TableB on TableA.id=TableB.id;

|<-----------------------TableAの範囲---------------------->|<-----------------------------TableBの範囲----------------------->|
ID          username    pcname      inputdate   pc_carrer   ID          username    phone_name  Maker       phone_carrer
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ------------
1           aaa         aa_pc       0611        high        1           aaa         aa_phone    bbb         low
2           bbb         bb_pc       0611        high        2           bbb         bb_phone    bbb         low
3           ccc         cc_pc       0613        low         3           ccc         cc_phone    ccc         low
4           ddd                     0613                    4           ddd                                 low

■TableA-TableC間の外部結合
sqlite> select * from TableA left outer join TableC on TableA.id=TableC.id;

|<-----------------------TableAの範囲---------------------->|<-----------------------------TableCの範囲----------------------->|
ID          username    pcname      inputdate   pc_carrer   ID          username    pcname      phone_name  pc_carrer   phone_carrer
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ------------
1           aaa         aa_pc       0611        high        1           aaa         aa_pc       aa_phone    high        low
2           bbb         bb_pc       0611        high        2           bbb         bb_pc       bb_phone    high        low
3           ccc         cc_pc       0613        low         3           ccc         cc_pc       cc_phone    low         low
4           ddd                     0613

結果を見るとわかるように、TableA、TableB、TableCのカラムがすべて表示されました。
これは、3テーブルを結合した場合でも同様になります!!

select * from TableA as A left outer join TableC as C on A.id=C.id inner join tableB as B on C.id=B.id;
※カラムが多くなるため、結果は割愛。

重複したカラム名をまとめるとかはないようですね。
だけど、変な処理が加えられていない分、AS句を用いることで結合した結果ほしいカラム名のみ限定させることができますね。

sqlite> select A.ID as ID,A.username as username, A.pcname as pcname,B.phone_name as phone_name from TableA as A inner join TableB as B on A.id=B.id;
ID          username    pcname      phone_name
----------  ----------  ----------  ----------
1           aaa         aa_pc       aa_phone
2           bbb         bb_pc       bb_phone
3           ccc         cc_pc       cc_phone
4           ddd

qlite> select A.ID as ID, A.username as username,A.inputdate as Input_Date, C.pcname as pcname, C.phone_name as phone_name from TableA as A left outer join TableC as C on A.id=C.id;
ID          username    Input_Date  pcname      phone_name
----------  ----------  ----------  ----------  ----------
1           aaa         0611        aa_pc       aa_phone
2           bbb         0611        bb_pc       bb_phone
3           ccc         0613        cc_pc       cc_phone
4           ddd         0613

以上、同様のカラム名が含まれた場合の結合でした。