
お世話になっております。Sql初心者でUpdate文の書き方で困っております。ご教授の程宜しくお願い致します。
下記のような2つのテーブルがあります。
関係はTotalが合計を表すテーブルでDetailが明細を表すテーブルです。OTとNoの組み合わせで一意となります。TotalテーブルのTotalAmountはDetailテーブルのAmountの合計です。
行いたいUpdateは『TotalAmountとTotalの合計が合わないもののみTotalAmountをOTとNoで紐ずくDetailテーブルのAmountの合計で更新する』です。
■テーブル名:Total
-------------------------------------------------------
列名) OT No TotalAmount
-------------------------------------------------------
20 100000 0
20 100001 0
20 100002 10
■テーブル名:Detail
-------------------------------------------------------
列名) OT No Amount
-------------------------------------------------------
20 100000 10
20 100000 10
20 100001 20
20 100001 30
20 100002 5
20 100002 5
■作成したSql
update Total set TotalAmount = (select Sum(Amount) from Detail
Inner Join Total on Detail.OT = Total.OT and Detail.No = Total.No
group by Total.TotalAmount,Total.OT,Detail.OT,Total.No,Detail.No
having Total.TotalAmount <> sum(Detail.Amount) )
where OT = (select OT from Detail) and No = (select No from Detail) and
TotalAmount <> (select sum(Amount) from Detail)
いろいろ試行錯誤しながら作成しましたが『サブクエリは複数の値を返しました ~ 』というエラーが出てしまいます。
つっこみどころ満載だと思いますがご教授の程宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>この部分は何を行っているのでしょうか?
>>isnull(d.TotalAmount,0)
そもそもleft outer joinにしている理由は「Totalにはあるけど、(削除されたなどで)Detailにはないというケース」を想定してのものです。
Detailが万一なくなっていれば、やはりTotalAmountは0にしたいでしょうから。
上記のケースではDetail側はデータがないので、NULLになります。
ISNULLは「NULLならばゼロにする」という関数です。
これにより上記ケースでもTotalAmountを0にできます。
No.2
- 回答日時:
分かりやすく考えるには、一旦Detailを集計してからJOINした方がよいですね。
update Total
set TotalAmount=isnull(d.TotalAmount,0)
from Total t
left outer join
(select OT,No,sum(Amount) TotalAmount from Detail
group by OT,No) d ON d.OT=t.OT and d.No=t.No
where t.TotalAmount<>isnull(d.TotalAmount,0)
この回答への補足
なるほどです。ありがとうございます。
更新もきれいにできました。
1つ質問です。
この部分は何を行っているのでしょうか?
>isnull(d.TotalAmount,0)
宜しくお願いします。
No.1
- 回答日時:
そもそも1回のクエリーでTotalテーブル全行のTotalAmountを更新する事自体が無理な気がします。
set TotalAmount = (...) の部分のサブクエリーは where句が無いため group byしか結果の組み合わせ分(複数)の値が返ってくるので、どの値にアップデートしたらいいのか特定できなくてエラーになります。
※ サブクエリーだけ一回実行してみるとわかると思います。
まず、TotalテーブルからOTとNoとTotalAmountの各値を取得しておき
update Total set TotalAmount = (select Sum(Amount) from Detail where OT = [OTの値] and No = [Noの値]) where Detail where OT = [OTの値] and No = [OTの値] and TotalAmount <> (select Sum(Amount) from Detail where OT = [OTの値] and No = [Noの値]);
をぐるぐる回すのがいいのではないでしょうか。
ご指摘ありがとうございます。
特に↓部分なるほどです。
>set TotalAmount = (...) の部分のサブクエリーは where句が無いため group byしか結果の組み合わせ分(複数)の値が返ってくるので、どの値にアップデートしたらいいのか特定できなくてエラーになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのエラー(~付近に不適切な...
-
SQL Date型の列から年月だけを...
-
Accessの重複なしのカウントの...
-
SQLサーバで和暦から西暦に変換...
-
Microsoft SQL Serverについて
-
Wacom Cintiq 16 と Wacom Cint...
-
SQLをはじめから勉強するには
-
SQL クエリ データ数
-
SQL Server management studio ...
-
Tverは無料でしょうか?
-
サーバー破壊
-
Visuaal Studio Community 2022...
-
Access2021 「ISNULL関数には引...
-
甘いものがすきなのってなおせ...
-
SQLて何ですか!
-
生え際から顎先まで17.5 頭頂か...
-
sql serveについて
-
SQLを駆使したデータ抽出ってど...
-
自己相関サブクエリと自己結合...
-
DBのテーブルの設計ができず困...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
複数のテーブルから同じ条件で...
-
Insert Into Select での重複に...
-
SQL文で
-
MS Accessの抽出の仕方について...
-
データベース設計のこと
-
Accessで在庫管理を
-
大学でSQLの授業があるのですが...
-
Sql文のUpdateと副問い合わせで...
-
select into句のトランザクショ...
-
SQLでの更新クエリに関する質問
-
(初心者です)パフォーマンス...
-
BETWEEN A AND B
-
空のテーブルの判別
-
年齢分布テーブルの再集計SQL
-
SELECT時のパフォーマンス
-
リレーションシップ 全データを...
-
where条件内のin句について
おすすめ情報