SQL サブクエリの扱い方について復習
SQLを書いていてサブクエリを使うのですが基本的な使い方のおさらいをしておきたいと思ったので記載いたします。
今回はデータうんぬんではなく、サブクエリを使う際の注意になります。
まず以下のようなサブクエリの使い方をしているとします
SELECT customers.name, ch.birthday, ch.number_of_purchases FROM orders INNER JOIN ( SELECT customer_histories.number_of_purchases, customers.name FROM customer_histories INNER JOIN customers ON customers.id = customer_histories.customer_id WHERE customers.birthday <= '1990-01-01' ) AS ch ON orders.customer_id = ch.customer.id WHERE orders.date >= '2017-05-01'
SQLの意味自体は一旦置いておいて、上記のSQLだとエラーが出ます。 原因は2つありまして、どちらも最初のSELECTの中にあります。
まず一つ目は [customers.name]です。 こちらエラーになる原因ですが、customersのnameがほしいんでしょうが customersの結合はサブクエリの中で行われています。書き方としましては サブクエリの最後に AS ch とあるので [ch.name]が正しい書き方になります。
続いて2つ目は [ch.birthday]になります こちらcustomersのbirthdayを表示仕様としているのですが サブクエリのSELECTにcustomers.birthdayがありません。 なのでbirthdayを呼び出せずエラーになります。 サブクエリのSELECTにcustomers.birthdayを入れるとオーケーです。
以下正しく修正したSQLになります。
SELECT ch.name, ch.birthday, ch.number_of_purchases FROM orders INNER JOIN ( SELECT customer_histories.number_of_purchases, customers.name, customers.birthday FROM customer_histories INNER JOIN customers ON customers.id = customer_histories.customer_id WHERE customers.birthday <= '1990-01-01' ) AS ch ON orders.customer_id = ch.customer.id WHERE orders.date >= '2017-05-01'
今までのブログでは特に書かずに進めていたところなのですが 結構エラーが出たり、質問されたりしたので一度まとめてみました。
それでは