今回はsqlの結合について確認したいことがありましたので、確認結果を残しておきます!!
ある日のこと、、、
同じカラム名を含んだテーブルが乱立した環境を見つけ、
データベース設計出来てないなw。継ぎ足しで開発していった負の遺産かな?
と色々考えを巡らせたのですが、ふと思ったのです。
同じカラム名が含まれたテーブル同士を内部結合、外部結合した時にどうなのか?と!!
同じカラム名なのでどちらかが表示されるのか?
エラーとなってしまうのか?
結合したテーブルのカラムが全表示されるのか?
う~ん。。。とりあえずやってみることにしました!!
まぁ、データベース設計をちゃんと行っていればこんな現象はまず発生しないんですけどねw。
今回はsqliteで定義したテーブルはこちらの通り!!
さらに各テーブル毎に保存したレコードはこちら。
※同じカラム名に対しては同じデータが書き込まれるようにレコードを保存いたしました。
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
以上、同様のカラム名が含まれた場合の結合でした。