SQL文による予算と料理の紐付け方法

このQ&Aのポイント
  • 予算と料理を紐付けるためのSQL文を作成する方法について教えてください。
  • 現在のSQL文では予算が1000円の場合に正しく結果を表示できていません。改善する方法を教えてください。
  • 予算が1000円の場合にカレーとうどんが正しく表示されるSQL文を作成したいのですが、どのような条件を追加すれば良いですか?
回答を見る
  • ベストアンサー

紐付いているデータ

テーブルA  料理   値段 -------------       カレー  500 ラーメン 200 うどん  500 テーブルB 予算   値段 ----------------- 1000   500 500    200 1000   500 上のようなA、B、2つのテーブルがあります。 任意に予算を入れたら、紐付いている値段の料理が出力されるような SQL文を書きたいと考えています。 select * from テーブルA where 値段 = (select 値段 from テーブルB where 任意の予算) というようなSQLを書いてみたのですが、これだと予算が500円ならば 出力されますが、1000円だと2つレコードがあるので、うまく 表示されません。 これを、予算が1000円のものという条件を指定することで、 カレーとうどんが出力されるようなSQLを作るにはどうしたら 良いでしょうか? ご教授ください。

noname#32335
noname#32335
  • Oracle
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • 1E-9
  • ベストアンサー率51% (22/43)
回答No.1

副問合せから返ってくるレコード数が複数か単数かわからない場合は、=ではなく、INを使うと出るのではないでしょうか。 select * from テーブルA where 値段 in (select 値段 from テーブルB where 任意の予算) ただしこれだと1000円きっかりの時しか出ないので、もし「予算が1000円だったら値段が1000円以下のものを表示する」という風にするのであれば、 select * from テーブルA where 値段 <ANY (select 値段 from テーブルB where 任意の予算) とするといいと思います。

関連するQ&A

  • FROM テーブル 名前 ?

    SQLについての質問です. select a.name, b.id from テーブルA a テーブルB b where... というSQLのfromのあとはどういう意味なのでしょうか? テーブルAと同じ型のaを作る という意味なのでしょうか??

  • データの件数を集計するための SQL

    データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。

    • ベストアンサー
    • MySQL
  • 別テーブルのデータ結合

    PostgresSQLを勉強中です。 そこで質問ですが、A、Bという各テーブルの値の合計を求めたいのですがいまいちわからないので教えてください。 例 Aテーブル: ID type 値段 date 0001 あ 100 0902 0002 あ 110 0903 0003 え 421 0910 Bテーブル: ID type 値段  date 0001 お 500 0901 0002 か 210 0801 0004 さ 333 0901 となっているときにA,Bテーブルの合計をtypeは関係なく出したいのです。 たとえばIDが0001であれば100+500で600というかんじです。 下記のように結合はできましたが値段部分の総合計をどうやってだせばいいのかわかりません。 select date,type,値段 from Aテーブル where ID = '0001' and date >= '0901' UNION select date,type,値段 from Bテーブル where ID = '0001' and date >= '0901' order by date 簡単なのかもしれませんがおしえてください。 よろしくお願いします。

  • SELECT のWHEREに別のSELECT

    SELECT のWHEREに別のSELECTの結果を当てはめることは可能でしょうか? ただし、引用テーブルは同じテーブルとします。(DDD) 例 SELECT * FROM DDD WHERE B = (SELECT B FROM DDD WHERE C=1) 再起SQLとはまた違うのでしょうか?

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。

  • データの無いテーブルと結合してデータ抽出

    以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0   AA 1   BB 2   EE 3   FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2   2004   CC 3   2004   DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0   AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY =  (SELECT MAX(C.DAY)  FROM 履歴 C  WHERE  A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。

  • 意味は同じはずなのに結果が違います。

    SELECT * FROM テーブルA LEFT OUTER JOIN ( SELECT * FROM テーブルB WHERE テーブルB.列X IS NOT NULL) as テーブルB ON テーブルA.列A = テーブルB.列A SELECT * FROM テーブルA LEFT OUTER JOIN テーブルB ON テーブルA.列A = テーブルB.列A WHERE テーブルB.列X IS NOT NULL 上のSQLも下の同じ事をしてると思うのですが 上では検索結果が10件出た場合 下では0件になってしまいます。 SQL自体シンプルで間違っていないと思うのですがなぜでしょうか?

  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • オラクルで外部結合

    オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;