- PR -

版数が一番最新の金額だけを合計する場合のSQL文につきまして

1
投稿者投稿内容
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-06-23 11:06
お世話になります、newbornです。

標題の様に、版数が一番最新の金額だけを合計したいのですが、SQL文の作成でつまずいてしまったので、ご指導頂けましたら幸いです。

bukkenテーブル

主キー 物件番号    版数   金額
id |  bukkenno | hansuu | kingaku
1 | 1 | 0 |100
2 | 1 | 1 |100
3 | 2 | 0 |200
4 | 2 | 1 |250
5 | 2 | 2 |250
6 | 3 | 0 |1000

上記のようなテーブルで、物件番号ごとに版数をもち(版数は0から順番にカウントアップされます)、物件番号ごとに一番新しいレコードの金額だけを合計して表示したく思っております。

上記レコードの場合、

物件番号1、版数1=100円
物件番号2、版数2=250円
+物件番号3、版数0=1000円
-------------------------------
= 1350円

という金額をSQL文で表現したいと思っております。
宜しくお願いいたします。


[ メッセージ編集済み 編集者: newborn 編集日時 2006-06-23 11:07 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-06-23 11:35
RDBMSがなんなのか書いてないのですが、サブクエリが使えるという前提で、

コード:
select bukkenno, hansuu, kingaku from bukken A
inner join 
(select bukkenno, MAX(hansuu) hansuu from bukken B group by bukkenno)
on A.bukkenno = B.bukkenno and A.hansuu = B.hansuu


でできるのではないでしょうか。もしサブクエリが使えないのなら、ビューを使えば
いいと思います。
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-06-23 11:57
uk様、

お早い返信ありがとうございます。
Sqlserver2000を使用しております。記載もれがありすみませんでした。

uk様のコードをそのままではエラーが出てしまい、多少書き換えて無事に結果を確認することができました。ありがとうございます。

SELECT A.bukkenno, A.hansuu, A.kingaku
FROM bukken A INNER JOIN 
(SELECT bukkenno, MAX(hansuu) hansuu FROM bukken GROUP BY bukkenno) B
ON A.bukkenno = B.bukkenno AND A.hansuu = B.hansuu

ここでひとつ質問させていただきたいのですが、
bukkennoとhansuuで二重結合していると思うのですが、わたしのちっぽけな
経験で、二重結合すると処理がものすごく重くなったことがあるのですが、
二十結合=タブーということはないのでしょうか。

宜しくお願いいたします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-06-23 12:42
Oracle 9i で出た現象ですが、

今回の例で、結合順を逆にした場合に、劇的に遅くなりました。
SELECT A.bukkenno, A.hansuu, A.kingaku
FROM (SELECT bukkenno, MAX(hansuu) hansuu FROM bukken GROUP BY bukkenno) B
INNER JOIN bukken A
ON A.bukkenno = B.bukkenno AND A.hansuu = B.hansuu

おそらく、Indexが関係していると思われます。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-06-23 12:48
引用:

ここでひとつ質問させていただきたいのですが、
bukkennoとhansuuで二重結合していると思うのですが、わたしのちっぽけな
経験で、二重結合すると処理がものすごく重くなったことがあるのですが、
二十結合=タブーということはないのでしょうか。


自己結合といいます。
最初のSELECTの結果セットとサブクエリの結果セットが結合されるのは、
通常の結合と変わりありません。

かずさんもおっしゃるように、おそらくインデックス等の問題でしょう。
クエリアナライザで実行プランを確認してみてください。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-06-23 12:51
引用:

uk様のコードをそのままではエラーが出てしまい、多少書き換えて無事に結果を確認することができました。ありがとうございます。


やっぱり確認しないとミスがありますね…すみません。

引用:

ここでひとつ質問させていただきたいのですが、
bukkennoとhansuuで二重結合していると思うのですが、わたしのちっぽけな
経験で、二重結合すると処理がものすごく重くなったことがあるのですが、
二十結合=タブーということはないのでしょうか。


二重結合という用語は初めて見ましたが、結合条件のフィールドが複数ある、という
意味ですか? 検索してみても化学系の用語しか引っかからないのですが。

で、そういう意味だとして、それはインデックスの貼り方によるだろう、としか言えない
ですね。また、複雑なクエリになるとオプティマイザが有効なプランを選択してくれない
場合があります。ですから、もしそうであればヒントを与えるなりすればいいと思います。

newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2006-06-23 13:20
皆様、
ご丁寧な解説有難うございます。

わたしも、二重結合という言葉を検索してみましたが、SQLではそのような
語句自体存在しないようです。
なぜか2つの結合条件で結合することを二重結合と呼ぶものとばかり勘違い
しておりました。申し訳ありません。
RDBにAccessを使用して、開発しておりました際に複数の結合条件でテーブルを結合
した結果、SQLの実行速度が劇的に遅くなったことを記憶しており、わたしの中では、
複数の結合条件で結合することがいけない事だとばかり思っておりました。
(複数の結合条件で結合するばあい、〜 ON A.bukkeno+A.hasuu = B.bukkeno+B.hasuu というように、文字列として合体して結合させておりました(^^;)
皆様のおかげでまた正しい知識を得ることができました。

大変有難うございます。

1

スキルアップ/キャリアアップ(JOB@IT)