質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

969閲覧

updateのためのsql

yuu789

総合スコア14

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2018/04/22 03:08

下のようなsqlを使い、update処理を行いたいと思っています。

SELECT
(SELECT Sum(t2.売上高) from (売上テーブルクエリをつくるためのサブクエリ) as t2,
WHERE
t1.年月日 = t2.年月日 AND t1.商品列 = t2.商品列
AND t2.[年月日 時刻] <= t1.[年月日 時刻]) AS 累計
FROM (売上テーブルクエリをつくるためのサブクエリ) AS t1;

(売上テーブルをつくるためのサブクエリは、とあるAtabl とBtablをinner joinで繋げ、on商品列で繋げてあります。)
このsqlを使い、商品列その2というフィールド、番号フィールド部分を元テーブルとしたテーブルに対しupdate処理を行いたいと思っています。

(売上テーブルクエリ

商品コード|年月日|年月日  時刻             |商品列|売上高
111  |2018/01/01 |2018/01/01  11:05:00|A|100
112  |2018/01/01 |2018/01/01  11:05:10|A|200
113  |2018/01/01 |2018/01/01  14:05:00|A|300
114  |2018/01/01 |2018/01/01  16:05:00|B|200
115|2018/01/02|2018/01/02  12:05:00|A|200
116  |2018/01/02 |2018/01/02  23:05:00|A|100)

(Atablの一部には
商品列その2|

Btablの一部には
商品列その2|番号が含まれています。)

そのようなことをするには、update set以外にはこのような(下のような)形で繋げれば良いのでしょうか?

SELECT
(SELECT Sum(t2.売上高) from (売上テーブルクエリをつくるためのサブクエリを上のそのまま持ってくる) as t2,
WHERE
t1.年月日 = t2.年月日 AND t1.商品列 = t2.商品列
AND t2.[年月日 時刻] <= t1.[年月日 時刻]) AS 累計
FROM (select〜,商品列その2,番号,〜 from~) AS t1 LEFT OUTER JOIN Atabl ON t1.商品列その2 = Atabl.商品列その2
LEFT OUTER JOIN t1 Btabl AS Btabl ON t1.番号=Btabl.番号 AND t1.商品列その2 = Atabl.商品列その2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ご指摘、ありがとうございます。

とても参考になりました。
見直してみます。

投稿2018/04/22 06:45

yuu789

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まず、提示のSQLが文法的に間違っているということもありますが、
それ以前に、集計クエリやサブクエリを含むクエリは更新できないため、更新クエリ(UPDATE ~)にはできない、ということを認識してください。

集計値で更新したい場合は、DSum、DCountなどの定義域集計関数を使かった更新クエリを作成する必用があります。
または、VBAでDAOかADOを使って更新することになります。
また、下記のリンク先の方法もあります。

更新クエリで定義域集計関数を使わずに集計する - hatena chips

どちらにしても、サブクエリを使ったSQLで更新という発想はあきらめて、上記のどれかの方法をトライしてください。

それで、行き詰まったら、その時点で再質問してください。

投稿2018/04/22 06:28

hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu789

2018/04/22 06:47

そうだったのですね・・・・知らなかったです、ありがとうございます。 教えてくださった方法の中でどの方法を使うか検討してみます。 とても参考になりました。 ありがとうございます。
yuu789

2018/04/23 01:30

hatena19さんはお仕事の受付みたいなことはしていらっしゃいますか? もし受付していらっしゃって、受付してくださるのであれば、これをVBAに変えるにはどういったコードを書けば良いか、みたいなことの依頼をお願いしたいのですが・・・
hatena19

2018/04/23 02:13

ここの規約の禁止事項に下記の項目があり、該当する恐れがあるのでここで答えるのは遠慮しておきます。 > 当社が事前に許諾しない本サービス上での宣伝、広告、勧誘、または営業行為 プロフィールをみてもらえれば連絡手段はあります。
yuu789

2018/04/23 05:41

すみません汗 了解しました。 そちらを見てみます。
guest

0

検証はしていません。文法事項のみ指摘します。

一見しておかしいと思ったのは

SQL

1select,商品列その2,番号,from~) AS t1 LEFT OUTER JOIN Atabl ON t1.商品列その2 = Atabl.商品列その2 2LEFT OUTER JOIN t1 Btabl AS Btabl ON t1.番号=Btabl.番号 AND t1.商品列その2 = Atabl.商品列その2

これが(売上テーブルクエリをつくるためのサブクエリ)なのですね。そして

SQL

1SELECT 2(SELECT Sum(t2.売上高) from (売上テーブルクエリをつくるためのサブクエリ) as t2, 3WHERE 4t1.年月日 = t2.年月日 AND t1.商品列 = t2.商品列 5AND t2.[年月日 時刻] <= t1.[年月日 時刻]) AS 累計 6FROM (売上テーブルクエリをつくるためのサブクエリ) AS t1;

とあります。

(売上テーブルクエリをつくるためのサブクエリ)のt1は何? 
一方で
(売上テーブルクエリをつくるためのサブクエリ)がt1ですよね。2つのt1がある?

投稿2018/04/22 04:49

kawakawa2018

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuu789

2018/04/22 06:47

ご指摘、ありがとうございます。 とても参考になりました。 見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問