- - PR -
SQLコマンドについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-05-27 18:14
初めまして。佐々木と申します。
初心者の質問で申し訳ございませんが、 ご指導頂けるとありがたいです。 下記の3つのテーブルがあるとします。 Sample A ------------ |区別|ランク| ------------ | A |LV1 | | B |LV2 | | C |LV3 | | D |LV4 | | E |LV5 | | F |LV10 | ------------ Sample B -------------------- |No |名前 |区別 | -------------------- |11 |一郎 |A | |12 |二郎 |B | |13 |三郎 |C | |14 |四郎 |B | |15 |五郎 |E | -------------------- Sample C ----------- |No |実績 | ----------- |11 |90 | |12 |80 | |13 |110 | |14 |90 | |15 |220 | ----------- この場合、下記のようなSQLを作りたいと思います。 ・テーブル「Sample B」のカラム「区別」と、テーブル「Sample A」のカラム「区別」を 紐付けてテーブル「Sample A」のカラム「ランク」を引っ張りだす。 ・ただし、テーブル「Sample C」を参照しカラム「実績」が100以上の場合は無条件にランク「LV10」を引っ張り出す。 条件分岐がうまくできません。 どなたかご指導頂けますでしょうか。 以上、宜しくお願い致します。 | ||||||||
|
投稿日時: 2008-05-27 21:50
使用してるDBMSとバージョンは何?
表式とcase句が使えるのなら、
ってので、いけるかも。 でも未検証なので、自信なし。 | ||||||||
|
投稿日時: 2008-05-27 22:05
以下、直接の回答ではないことをお断り申し上げておきます。
・初めての方のようなのでご存知なかったのかもしれませんが、SQL について質問される際は RDBMS に何を使用しているか、製品名とバージョンを書かれた方がよろしいと思います。 SQL92 や SQL99 といった標準仕様はありますが、製品によっては準拠が完全ではなかったり、また製品によっては特有の記法でより効率の良いクエリを書く方法があったりします。 ・「条件分岐がうまくできません」とのことですが、ご自身がどのようなクエリを書いてどのような結果を得、それが期待した結果とどのように違うのかを明記されるのも良いと考えます。 例えば私が隣の席にいたり後から見ていた同僚であれば、何をしてどのような結果になったのかがわかり、適切なアドバイスを差し上げられるかもしれません。 けれども、ネット上の掲示板では書かれている情報がすべてです。 言い換えると、書かれていない情報を回答者が知る術はありません。 以上、より詳細な情報を記載されるようお願いいたします。 苦言だけではナンですので、ヒントのみ差し上げたいと思います。 (SQL92 仕様に基づいていますが、今手許に RDBMS がないので動作確認していません(_ _)) テーブル A -------- |ID|VAL| -------- | 1| 1| | 2| 2| -------- クエリ SELECT ID, CASE WHEN VAL>=2 THEN 10 ELSE VAL END FROM A | ||||||||
|
投稿日時: 2008-05-27 23:41
DB2 では、
あるいは、2番目の ON 条件を
で出来ますが 他の RDBMSで可能かはチェックしていません。 [ メッセージ編集済み 編集者: とんくま 編集日時 2008-05-27 23:42 ] | ||||||||
|
投稿日時: 2008-05-28 04:20
蛇足とは思いますが、私の思考過程を少し解説すると
、
以上の説明は、かなり感覚的で厳密さに欠けるでしょうが、普通に SQL 文を組み立てるには結構有効だと思います。 | ||||||||
|
投稿日時: 2008-05-28 06:59
Oracle10gで作ってみました。
| ||||||||
|
投稿日時: 2008-05-28 17:06
> ・テーブル「Sample B」のカラム「区別」と、テーブル「Sample A」のカラム「区別」を
> 紐付けてテーブル「Sample A」のカラム「ランク」を引っ張りだす。 これは、一般的にコード→値の変換を 1)外部データとしての表を参照して行なうか、 2)プログラム(SQL文)内にハードコードするか、 の選択として捉えられるように思えます。 「区別」の数(テーブル「Sample A」の行数)、 「区別」の変更頻度、 対応する「ランク」値の変更頻度、 関連するSQL文・プログラムの数、 等が主な判断基準と成るでしょう。 > ・ただし、テーブル「Sample C」を参照しカラム「実績」が100以上の場合は無条件にランク「LV10」を引っ張り出す。 ”ランク「LV10」”と指定しているので、明智重蔵さんの方法も有るとは思いますが、 ”...を引っ張り出す”という表現にこだわると、私の方法も意味が有るかな(ランク値の変更(例えば、LVx → LVLx)が容易、等)と思います。 また、 SQL文内にランク「LV10」をコーディングするなら、 その他の「区別」についてもSQL文内にコーディングすれば、テーブル「Sample A」への参照は不要になります。
[ メッセージ編集済み 編集者: とんくま 編集日時 2008-05-28 17:09 ] |
1