情弱エンジニアのなかのblog

一人前のエンジニアになる為のブログです

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'

今までのブログでは特に書かずに進めていたところなのですが 結構エラーが出たり、質問されたりしたので一度まとめてみました。

それでは