
お世話になっております。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で○○の値以外を持っているレ...
-
ビューで引数を使いたい
-
select into句のトランザクショ...
-
複数のテーブルから同じ条件で...
-
「マスタ」と「テーブル」の違...
-
accessで移動平均する方法
-
請求と入金のテーブルの作成の...
-
ACCESS2000のテーブル構造
-
ACCESS2007 フォーム 「バリア...
-
SELECT文でのデッドロックに対...
-
3つ以上のテーブルをUNIONする...
-
オラクルではできるのにSQLSERV...
-
SI Object Browserのテーブルス...
-
SQL Server のデータをCSVファ...
-
sqlserverで集計結果をUPDATEし...
-
テキスト項目255ケタのメリット...
-
続.ORACLEのSELECTのソートに...
-
update文で質問です。 下記の条...
-
ACCESSのSQLで、NULLかNULLでな...
-
ACCESS 一つのフィールドに複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
IFで条件を分岐させてのINSERT...
-
ACCESS 一番最新の日付の金額...
-
Insert Into Select での重複に...
-
複数のテーブルから同じ条件で...
-
SQL 件数取得を速くしたい
-
空のテーブルの判別
-
SQLのDISTINCTで重複チェック
-
select into句のトランザクショ...
-
アクセス(Access)のサブクエ...
-
SQLServerで・・・
-
DB2 業種毎に連番をつけたいの...
-
2つのテーブルを結合して合計(...
-
大学でSQLの授業があるのですが...
-
where条件内のin句について
-
SQLで○○の値以外を持っているレ...
-
Sql文のUpdateと副問い合わせで...
-
条件が混在しているSQLで値取得
-
SQlite 2つのテーブル データ...
-
Accessクエリでのグループ化
おすすめ情報