あるテーブルから、最大値を持つレコードのキーと最大値だけでなく、そのレコードの値を出したいと思います。
最大値をもつレコードを抽出して、元のレコードと結合するしか方法はないのかなと思い、類似した質問があるような気もするのですが、条件が異なるとうまく行かないため、自分なりに考えてみました。
データベースはDB2です。
SELECT a.倉庫,a.品目,a.単価 FROM 在庫マスタ as a
where (a.品目,a.単価) in (select b.品目, max(b.単価)
from 在庫マスタ as b group by b.品目)
つまり、副問合せするときの結合キーが複数あるとSQLがエラーになってしまうようなのです。
結合キーが2つ以上ある時、このようなパターンの対処方法は無いでしょうか?
No.1
- 回答日時:
DB2はin述語で複数の要素のあるセットを扱えないのかな? Oracleもそうだったような……DBMSによって方言があるようです。
手元にDBの環境がないので、自信ないけれども……
SELECT a.倉庫,a.品目,a.単価 FROM 在庫マスタ as a
where a.品目 in
(select b.品目 from 在庫マスタ as b where b.単価
in (select max(c.単価) from 在庫マスタ as c group by c.品目))
No.2
- 回答日時:
数年前にDB2でのシステム開発支援をしたことがあるのですが、当時のDB2は、行値構成子(行値式)※1を使っての操作に制限がかなりありました。
※1 「where (列1,列2) 演算子 (値1,値2)」という条件式。
SQL-92で、標準SQLに取り入れられています。
行値構成子を使用しないSQL例を提示しますので、試してみてください。
<例1>
SELECT
a.倉庫,a.品目,a.単価
FROM 在庫マスタ AS a
WHERE EXISTS
(SELECT 1
FROM 在庫マスタ AS b
WHERE a.品目=b.品目
GROUP BY b.品目
HAVING a.単価=MAX(b.単価))
<例2>
SELECT
a.倉庫,a.品目,a.単価
FROM 在庫マスタ AS a
WHERE a.単価 >= ALL (SELECT b.単価
FROM 在庫マスタ AS b
WHERE a.品目=b.品目)
有難うございました。
何れも動作しました。
<例2>のほうが若干スピードは速いようです。
DB2でこのような書き方が出来るとは知りませんでした。
No.4
- 回答日時:
#2回答者です。
一番簡潔なSQL(#3さん提示のSQL)を思いつかなかった自分が、ちょっと情けないです。
代わりに、もう一つ別のSQLを提示しておきます。
DB2は、分析関数をかなり前から実装しています。分析関数を使えば、ネストの深いサブクエリに比べ、代替手段として使える上に、性能も出すことが可能です。
<例3>
SELECT
x.倉庫,x.品目,x.単価
FROM
(SELECT
RANK() OVER(PARTITION BY 品目 ORDER BY 単価 DESC) AS rank,
倉庫,品目,単価
FROM 在庫マスタ) AS x
WHERE x.rank=1
有難うございました。
言葉足らずでしたが、自分の使っているのはOS400のDB2なので、
機能が少ないのかもしれません。
OVER句が使えないようです。
再三のご回答有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessの実行時エラーについて
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
前月の取得について
-
AccessVBA データの受け渡し、...
-
異なるデータベース間のテーブ...
-
アクセス フィールド名に変数...
-
ACCESS ツリービューの作り方
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
Select結果をSelect
-
for whichの使い方
-
外部参照してるキーを主キーに...
-
エクセルで最後の文字だけ置き...
-
INSERT文でフィールドの1つだ...
-
OR と IN の違い
-
VBAのAccessでDATE型のINSERT
-
SQLサーバから、項目の属性(型...
-
JavaScriptの定数名が取り消し...
-
バッチでcsvファイルの指定のカ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
異なるデータベース間のテーブ...
-
ACCESS 商品毎の最新の単価を設...
-
Accessの不一致クエリについて
-
アクセス フィールド名に変数...
-
日付により変動する「単価」を...
-
Accessのテーブル構成について
-
ACCESSでクエリ作成時複数のフ...
-
Excel VBA ADODB
-
前月の取得について
-
テーブル名の トラン マスタ...
-
フィールドの数値を四捨五入の...
-
Access2000で、支払残金額を算...
-
ACCESSでDLookUpすると、不正な...
-
サブクエリの書き方
-
ACCESSのマスタの変更について
-
アクセスのフォーム上でのルッ...
おすすめ情報