読者です 読者をやめる 読者になる 読者になる
20代 / 独身 / 会社員

テーブル結合で同じテーブルを2度参照する

プログラミング MySQL

問題

商品テーブル

商品名 生産地ID 販売地ID
りんご 1 2
ぶどう 3 3
みかん 10 12

都道府県テーブル

都道府県ID 都道府県名
1 北海道
2 青森県
3 岩手県

例えば上記のようなテーブルがある。 この2つのテーブルを結合して下記のように出力したいとき、

期待値

商品名 生産地 販売地
りんご 北海道 青森県
ぶどう 岩手県 岩手県
みかん 群馬県 千葉県

“生産地"列と"販売地"列でそれぞれ同じ"都道府県名テーブル"を参照する必要がある。

しかし、下記のように普通に結合する時の書き方をすると、生産地の都道府県と販売地の都道府県の区別ができず、 #1066 - Not unique table/alias :'都道府県'(生産地IDと結合した都道府県テーブルと、販売地IDと結合した都道府県テーブル、どっちを参照したらよいかわからないよエラー)になってしまう。

SELECT 商品テーブル.商品名,
        都道府県テーブル.都道府県名,
        都道府県テーブル.都道府県名
FROM    商品テーブル
    LEFT JOIN 都道府県テーブル
        ON 商品テーブル.生産地ID = 都道府県テーブル.都道府県ID
    LEFT JOIN 都道府県テーブル
        ON 商品テーブル.販売地ID = 都道府県テーブル.都道府県ID

解決策

複数回参照するテーブル名を、ASを用いて別名にする

SELECT 商品テーブル.商品名,
        生産地テーブル.生産地,
        販売地テーブル.販売地
FROM    商品テーブル
    LEFT JOIN 都道府県テーブル AS 生産地テーブル
        ON 商品テーブル.生産地ID = 生産地テーブル.都道府県ID
    LEFT JOIN 都道府県テーブル AS 販売地テーブル
        ON 商品テーブル.販売地ID = 販売地テーブル.都道府県ID

都道府県テーブルをJOINするときにそれぞれ別名をつけ、新たにつけた名前を用いて表記することで、期待の結果が得られる。

参考