前提・実現したいこと
ExcelだったデータをAccessに移植した古いデータベースがあります。
ベースがExcelだったため、ピボットテールブルのような扱いをしており、
以下のような構造になっています。
ID 案件名 4月度売上 5月度売上 6月度売上
1 AAA 100 120 130
2 BBB 140 150 160
3 CCC 170 180 190
…
これをデータベースとして扱いやすいテーブル構造に変換するため、
1つの1年分のレコードを12分割し、以下のようなテーブルを作ろうと思っています。
ID 案件名 月度 売上
1 AAA 4月 100
2 AAA 5月 120
3 AAA 6月 130
…
13 BBB 4月 140
14 BBB 5月 150
…
しばらくは古いデータから定期的に新しいテーブルに
データを更新・インポートしたく、AccessのクエリをSQLで構築中なのですが
1カ月分のクエリは作れても、12カ月全部を一度に実行するクエリがうまく動作できません。
INSERT INTOとUNION ALLの組み合わせで、Access用の書き方が間違っているのかと思いますが、あまり例文も無く、躓いてしまいました。エラーが出ないようにするためには
どのようにSQLのクエリを記載すればよろしいでしょうか。
■1カ月分の追加クエリ(動作する)
INSERT INTO Newテーブル ( OldID, 案件名, 年度, 月度, 売上 ) SELECT [Oldテーブル].ID, [Oldテーブル].案件名, [Oldテーブル].年度, '4月', [Oldテーブル].[4月度売上] FROM Oldテーブル LEFT JOIN Newテーブル ON [Oldテーブル].ID = Newテーブル.OldID WHERE ([Oldテーブル].年度 >= 2021 AND NOT EXISTS (SELECT * FROM Newテーブル WHERE Newテーブル.OldID = Oldテーブル.ID));
■2カ月分の追加クエリ(動作しない)※本当は12カ月分やりたい
INSERT INTO Newテーブル ( OldID, 案件名, 年度, 月度, 売上 ) SELECT [Oldテーブル].ID, [Oldテーブル].案件名, [Oldテーブル].年度, '4月', [Oldテーブル].[4月度売上] FROM Oldテーブル LEFT JOIN Newテーブル ON [Oldテーブル].ID = Newテーブル.OldID WHERE ([Oldテーブル].年度 >= 2021 AND NOT EXISTS (SELECT * FROM Newテーブル WHERE Newテーブル.OldID = Oldテーブル.ID)) UNION ALL SELECT [Oldテーブル].ID, [Oldテーブル].案件名, [Oldテーブル].年度, '5月', [Oldテーブル].[5月度売上] FROM Oldテーブル LEFT JOIN Newテーブル ON [Oldテーブル].ID = Newテーブル.OldID WHERE ([Oldテーブル].年度 >= 2021 AND NOT EXISTS (SELECT * FROM Newテーブル WHERE Newテーブル.OldID = Oldテーブル.ID));
のように記述しましたが、エラーでクエリを保存できません。
発生している問題・エラーメッセージ
保存しようとすると以下のようなエラーが出ます。
クエリ式 '([Oldテーブル].年度 >= 2021 AND NOT EXISTS (SELECT * FROM Newテーブル WHERE Newテーブル.OldID = Oldテーブル.ID)) UNION ALL SELECT [Oldテーブル].ID, [Oldテーブル].案件名, [Oldテーブル].年度, '5月', [Oldテーブル].[5月度売上] FROM Oldテーブル LEFT JOIN Newテーブル ON [Oldテーブル].ID = Newテーブル.OldID WHERE ([Oldテーブル].年度 >= 2021 AND NOT EXISTS (SELECT * FROM Newテーブル WHERE Newテーブル.OldID = Oldテーブル.ID))'の 構文エラー:演算子がありません
試したこと
本来は、UpdateとRIGHT JOINで更新・追加を同時にしたいと思っていたのですが、
新しいデータベース側のSQL命令でRIGHT JOINが用意されてなく、
LEFT JOINしか対応しないために、更新しかできず追記がどうしても出来なかったため、
今は更新と追記を別々のクエリで作ってみています。
補足情報(FW/ツールのバージョンなど)
古いデータベースはAccessのデータベースで、新しいデータベースは
kintoneのデータベースをCData ODBC Driverでリンクテーブルとして読み込んでいます。
回答4件
あなたの回答
tips
プレビュー