初めまして。AccessSQLビュー・SQL文初心者です。
ググって調べるなどしましたが分からないためご教授ください。
バージョンはAccess2007です。下記のデータを抽出するため、最初はクエリのデザインビューで抽出条件を組もうとしたのですが、うまく組むことができなかったため、ごくたまに使うSQLビューにSQL文を記載したらエラーがでます。詳細は下記の通りです。
■抽出したいデータ
最終的に抽出したいデータは、指定期間内にある商品を購入した対象者のうち、その指定期間の1回前の購入時に
対象商品を購入していない人。過去に何度購入していたとしても、指定期間の直前の購入時に対象商品を購入して
いない場合は対象データとして抽出し、レコメンドを実施したい。
■抽出条件とこれまでに実施したこと(※テーブル名やカラム名などは仮称)
❶メインの売上データテーブルである[datatable]から、対象商品の対象期間の売上をローカルのワークテーブル「001」に落とした。「001」は対象期間に売れた「code」=1,2,3,4,5 という商品の売上レコードである。対象期間に複数回購入された顧客も含まれている。顧客データは「key」というカラムで売上レコードに保持している。売上日は「ymd」である。
❷次に、「001」をGroupbyして、「key」と「ymd(指定期間の最小値)」のワークテーブル「002」を作成した。
(対象期間に複数回購入した顧客がいたため)
❸「002」のデータを元に、当該顧客が、指定期間の直前に購入したデータを「003」というワークテーブルに落としたい。SQLビューで構築したところエラーがでた。
❹最終的には「001」と「003」を突合し、「初めて購入された方」「前回にcode=1,2,3,4,5の商品を購入されていない方」に対してレコメンドを実施するのが目的。
■SQL文
❸でSQLビューに書き込んだ内容は下記の通りです。
<パターン1>
SELECT [datatalbe].key, MAX([datatalbe].ymd) INTO 003
FROM [datatalbe]
WHERE EXISTS (SELECT 002.key, 002.ymd, FROM 002 WHERE [datatalbe].key = 002.key AND [datatalbe].ymd < 002.ymd) GROUP BY key;
■エラーメッセージ
エラーメッセージは下記の通りです。
『 クエリ式 'EXISTS (SELECT 002.key, 002.ymd, FROM 002 WHERE [datatalbe].key = 002.key AND [datatalbe].ymd < 002.ymd)'の構文エラー 』のメッセージを「OK」で閉じるてSQLビューに戻ると、シングルクォーテーションの箇所だけが黒のバックカラーで反転され、白抜き文字の表示となっています。
ちなみに、自分なりに調べて修正した、下記のパターンでも同じ箇所で同様のエラーでした。
<パターン2>
SELECT [datatalbe].key, MAX([datatalbe].ymd) INTO 003
FROM [datatalbe]
WHERE EXISTS (SELECT * FROM 002 WHERE [datatalbe].key = 002.key AND [datatalbe].ymd < 002.ymd) GROUP BY key;
<パターン3>
SELECT [datatalbe].key, MAX([datatalbe].ymd) INTO 003
FROM [datatalbe]
WHERE EXISTS (SELECT 002.key, 002.ymd, FROM 002 INNER JOIN [datatalbe] on 002.key = [datatalbe].key AND [datatalbe].ymd < 002.ymd) GROUP BY key;
長文失礼いたしました。伝わりますでしょうか?
何か構文を間違えている箇所などありましたら、ご指摘いただけますと幸いです。
当て推量ですが、アルファベットやカギ括弧が全角になっていませんか?エラーはWHERE EXISTS句ですが、念のため、SELECT INTO FROM句から確認してみて下さい。Wordにコピペすると見やすいかも。
りんごさん
ご教示ありがとうございます。本日確認してみます。取り急ぎ返信まで。
とりあえず、
001
とか002
のような数字が始まるテーブル名は、SQL内では[]
で囲む必要があります。[001]
[002]
というように。とのことなので、実際は違うのかもしもませんが。
りんごさんも指摘してますが、全角とか全角空白もエラーの原因になることがありますので、
できれば実際のSQLをコピーしてそのまま貼り付けてもらった方が原因の特定がしやすいですけどね。
提示のSQLにはシングルクォーテーションはないですけど。
hatenaさん
ご教示ありがとうございます。本日確認してみます。たしかに[]で括っていなかったですが、他のアクセスのデザインビューで作成したインナージョインのクエリをSQLビューで確認した時、ローカルのワークテーブルは[]で括ってなかったのでそれに合わせた記憶があります。どちらにしても一度確認してみます。あと、実際のSQLを貼り付けた方が…との由、ごもっともかと存じます。ご教示いただいた解決策でクリアにならない場合は、エラーのキャプチャも含めてそのまま貼付して解決策を仰ぎたいと思います。取り急ぎ返信まで。
FROM句では必要ないですが、それ以外では[]で括る必要があります。
(SELECT [002].key, [002].ymd, FROM 002 WHERE [datatalbe].key = [002].key AND [datatalbe].ymd < [002].ymd)
括らないと、数値と区別がつかないので。FROM句には数値が来ることはないのでエラーにならないのだと思います。
hatenaさん
追加でご教示いただきありがとうございます。
なるほど、勉強になります。
下記で構文エラーが出なくなりました!
SELECT [datatalbe].key, MAX([datatalbe].ymd) INTO 003
FROM [datatalbe]
WHERE EXISTS (SELECT * FROM [002] WHERE [datatalbe].key = [002].key AND [datatalbe].ymd < [002].ymd) GROUP BY key;
とにかく、エラーが出なくなるまで数値のワークテーブルを[]で括ってみようと思い、試していたら解決しました。
hatenaさん、りんごさん、この度はありがとうございました、勉強になりました。
てか、仮称とはいえ、tableをtalbeと記載ミスしてますね…。そりゃ、どこかが全角になってないか?って思いますよね。失礼しました。
SQLマネジメントスタジオでSQL文投げた時と比べて、リクエスト投げても全くレスポンス返ってこないですが、それは別問題なのでなんとかします。SQLマネジメントスタジオ使えない環境のオペレーターが月次の作業をするのでAccessでなんとかしたくて…。今日はぐっすり寝られそうです。ありがとうございました!