元テーブル
データID 顧客ID
接続1テーブル
データID 顧客ID メモ
接続2テーブル
データID メモ
以上の三つのテーブルがあり、
ほしい結果は
データID 顧客ID メモ
です。
元.データID = 接続1.データID AND 元.顧客ID = 接続1.顧客ID ※
が優先され、それに当てはまらなかったレコードのみ(顧客IDが接続1に存在しない)
元.データID = 接続2.データID ※※
の接続がしたいです。
UNIONクエリで1と2を縦に接続すればいいかと思いましたが
1と2のデータIDには重複があり、メモの内容も違います。
CASE文で接続データを分岐するのだと思いますが
※の結果がなかった時に※※とする分岐方法がわかりませんでした。
追記
多くの方から質問の仕方に対するご指摘いただきましてありがとうございました。
質問の内容があいまいだったと反省しております。
テーブル定義とサンプルデータ、出したいSELECT文のイメージを申し上げます。
以下の三つのテーブルがある
元テーブル
CREATE TABLE 元テーブル( 連番id INT(11) AUTO_INCREMENT NOT NULL, データID VARCHAR(30) NOT NULL, 顧客ID VARCHAR(30) NOT NULL, PRIMARY KEY (連番id) );
元テーブルのデータ
INSERT INTO `元テーブル` (`連番id`, `データID`, `顧客ID`) VALUES (NULL, '501', '101'), (NULL, '502', '101'), (NULL, '601', '102'), (NULL, '602, '102'), (NULL, '701', '103'), (NULL, '702', '103');
テーブル1
CREATE TABLE 接続1テーブル( 連番id INT(11) AUTO_INCREMENT NOT NULL, データID VARCHAR(30) NOT NULL, 顧客ID VARCHAR(30) NOT NULL, MEMO VARCHAR(30) NOT NULL, PRIMARY KEY (連番id ) );
テーブル1のデータ
INSERT INTO `接続1テーブル` (`連番id`, `データID`, `顧客ID`, `MEMO`) VALUES (NULL, '501', '101', '101顧客専用501'), (NULL, '601', '102', '102顧客専用601');
テーブル2
CREATE TABLE 接続2テーブル( 連番id INT(11) AUTO_INCREMENT NOT NULL, データID VARCHAR(30) NOT NULL, MEMO VARCHAR(30) NOT NULL, PRIMARY KEY (連番id ) );
テーブル2のデータ
INSERT INTO `接続2テーブル` (`連番id`, `データID`, `MEMO`) VALUES (NULL, '501', 'メモ501'), (NULL, '502', 'メモ502'), (NULL, '601', 'メモ601'), (NULL, '602', 'メモ602'), (NULL, '701', 'メモ701'), (NULL, '702', 'メモ702');
求めたい結果
|顧客ID|データID|メモ|
|:101|:501|:101顧客専用501:|
|:101|:502|:メモ502:|
|:102|:601|:102顧客専用601:|
|:102|:602|:メモ602:|
|:103|:701|:メモ701:|
|:103|:702|:メモ702:|
元テーブル.データIDをテーブル1.データID外部結合し、顧客ID、データID、メモの結果を出したいのですが
顧客IDがテーブル1に存在しないときに結合先を元テーブル.データIDとテーブル2.データIDに変更したいのです。
dameo様のおっしゃる「3つの表を一気に外部結合した上で、接続1、接続2どちらか一方がNULLでないという条件で行を抽出、さらにSELECT句でCASEを使ってメモを優先順位どおりに出せばいいのかなと思います。」というのが解なのかな?といま検討中ですが、能力不足でまだそのヒントを生かせておりません。
もうしばらく考えるお時間を頂きたいと思います。
皆様、お時間を割いていただいてありがとうございます。
回答2件
あなたの回答
tips
プレビュー