[SQL] 条件(カラムの値)によってJOIN対象のテーブルを変える

概要

Aテーブルのカラム値によってJOINするテーブルをBテーブルまたはCテーブルのどちらかにする。
例)
salesテーブルのsale_typeが1の場合はusersテーブルのnameを、
sale_typeが2の場合はcustoersテーブルのnameを取得する。

テーブル定義

// saleテーブル
CREATE TABLE `sales`
(
  `id` INT UNSIGNED AUTO_INCREMENT,
  `sale_type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '販売タイプ(1:ユーザー、2:得意先)',
  `target_id` INT UNSIGNED NOT NULL COMMENT '対象ID',
  `price` INT COMMENT '金額',
  PRIMARY KEY (`id`)
}

// usersテーブル
CREATE TABLE `users`
(
  `id` INT UNSIGNED AUTO_INCREMENT,
  `name` varchar(20) NOT NULL COMMENT 'ユーザー名称',
  PRIMARY KEY (`id`)
}

// customersテーブル
CREATE TABLE `customers`
(
  `id` INT UNSIGNED AUTO_INCREMENT,
  `name` varchar(20) NOT NULL COMMENT '得意先名称',
  PRIMARY KEY (`id`)
}

SQL

SELECT sales.*, users.name as user_name, customers.name as customer_name
  FROM sales
  LEFT JOIN users ON users.id = sales.target_id AND sales.sale_type = 1
  LEFT JOIN customers ON customers.id = sales.target_id AND sales.sale_type = 2

LEFT JOINのON条件で絞り込んでしまえば良い。
これをしないと不適切なデータが取れてしまい、場合によっては情報漏洩にも繋がりかねない。



SQLアンチパターン

SQLアンチパターン

  • 作者:Bill Karwin
  • 発売日: 2013/01/26
  • メディア: 大型本