ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

SQLの確認時は*でデータを参照していても問題ないけれど、プログラム上では使わない方が無難

2つのテーブルを結合して、データを取得している部分がありました。
以下のようなクエリで取得していました。

SELECT table1.mail, teble2.data1, * FROM table1
  LEFT OUTER JOIN teble2 ON table1.id = table2.id 

きっかけ

仕様追加で、3つのテーブルを結合して、データを取得しなければならなくなり、以下のように修正しました。

SELECT table1.mail, teble2.data1, teble3.mail AS test_mail, * FROM table1 
  LEFT OUTER JOIN teble2 ON table1.id = table2.id 
  LEFT OUTER JOIN teble3 ON table1.id = table3.id 

プログラムからmailカラムとtest_mailカラムのデータを利用したら、mailカラムのデータが想定外のデータになっていて、想定とは異なる結果になっていました。

原因を考える

なぜなんだろうと考えてみたところ、クエリに*があるため、table1のmailカラムのデータを取得しているつもりが、table3のmailカラムのデータを取得しているのではないかと気づきました。
気づきを反映してクエリを

SELECT table1.mail, teble2.data1, teble3.mail AS test_mail FROM table1 
  LEFT OUTER JOIN teble2 ON table1.id = table2.id 
  LEFT OUTER JOIN teble3 ON table1.id = table3.id 

としたところ、想定通りのデータになって、プログラムの処理は想定した結果になりました。

テストでクエリを書いたときに、*を使ってデータを確認して、そのままプログラムに反映していたのが、今回の事象を引き起こしていました。