dポイントプレゼントキャンペーン実施中!

SQL初心者です。

ACCESSでSQL文を記述していますが、どうもうまくいきません。

まず、「顧客マスタ」と「問合せ履歴」というテーブルがあります。
「顧客マスタ」は1顧客1レコードの状態、「問合せ履歴」は1顧客に対してN個のレコードがあります。

「顧客マスタ」
顧客ID|顧客名|顧客住所|・・・・
1  |田中 |東京  |
2  |石井 |神奈川 |
3  |斉藤 |千葉  |
4  |藤井 |東京  |

「問合せ履歴」
顧客ID|  登録日 |問い合わせ内容|・・・・
1  |2000/11/04 |新規注文   |
1  |2001/05/04 |追加注文   |
2  |2005/07/19 |事前打合せ  |
2  |2005/07/30 |見積依頼   |
4  |2014/01/11 |現地調査依頼 |
4  |2014/06/04 |新規注文   |

両方のテーブルに「顧客ID」が存在するので、これをキーにLEFTJOINして、顧客マスタの全件と、問合せ履歴のある顧客については問い合わせ内容を結合したいと考えています。

出力結果を1顧客1レコードのユニークな状態にしたい、且つ問合せ履歴のある顧客は最も古い問合せのレコードを結合したいと考え、以下のSQL文を記述したのですがうまくいきません。

=====
SELECT 顧客マスタ.*, 問合せ履歴.*
FROM 顧客マスタ LEFT JOIN 問合せ履歴 ON 顧客マスタ.顧客ID = 問合せ履歴.顧客ID
LEFT JOIN (SELECT MIN(問合せ履歴.登録日),問合せ履歴.顧客ID FROM 問合せ履歴 GROUP BY 問合せ履歴.顧客ID) AS T1
ON 顧客マスタ.顧客ID = T1.顧客ID;
=====

どうすればうまくいくでしょうか。分かりにくいかもしれませんが、よろしくお願いします。

質問者からの補足コメント

  • なお、ACCESSのエラーの内容は「演算子がありません」というものでした。。根本的に考え方が間違っているのでしょうか。。。

      補足日時:2016/07/25 12:48

A 回答 (2件)

SELECT


A.*
, B.*
FROM
顧客マスタ A
LEFT JOIN ( SELECT
B.*
FROM
問合せ履歴 B
WHERE
B.登録日 = ( SELECT
MIN(登録日)
FROM
問合せ履歴 C
WHERE
B.顧客ID = C.顧客ID
)
) B
ON A.顧客ID = B.顧客ID
「ACCESSでのSQL文」の回答画像1
    • good
    • 0
この回答へのお礼

ありがとうございました!希望する状態になりました。GROUP BYを使わずともできるんですね。
助かりました。

お礼日時:2016/07/25 14:12

なお、ACCESSでLEFT JOINを複数利用する場合、()で括ってやらないとダメなようです。


SELECT
顧客マスタ.*
, 問合せ履歴.*
FROM
( 顧客マスタ
LEFT JOIN 問合せ履歴
ON 顧客マスタ.顧客ID = 問合せ履歴.顧客ID
)
LEFT JOIN ( SELECT
MIN(問合せ履歴.登録日)
, 問合せ履歴.顧客ID
FROM
問合せ履歴
GROUP BY
問合せ履歴.顧客ID
) AS T1
ON 顧客マスタ.顧客ID = T1.顧客ID

ただし、このクエリでは、T1内に存在する顧客IDが合致するものすべてを抽出してしまうので、1顧客IDに対して複数レコードを抽出してきてしまうため、間違いです。
    • good
    • 0
この回答へのお礼

助かりました

追加での補足、ありがとうございます!

お礼日時:2016/07/25 14:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す