• 締切済み

3つのテーブルからの抽出SQL

表1・・・商品ID 表2・・・商品ID、賞味期限、価格ID 表3・・・価格ID、商品価格 このような表があるとします。 ここで、商品価格ごとにもっとも賞味期限の古い商品IDを表示させてい場合、どのようなSQL文を書けばよいでしょうか? また、オラクル8でお願いします。 例題となるテーブルとレコードが紛らわしいですが、よろしくお願いいたします。

  • Oracle
  • 回答数3
  • ありがとう数6

みんなの回答

  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.3

質問にあるようなテーブルであれば、3表も結合する必要は 無いと思いますが、何か3表使わなければならない理由でも あるのでしょうか? 質問者さんとしても何も考えてはおられないと思いますが、 どういった SQL をお考えでしょうか? SELECT   T.商品ID FROM   (    SELECT     T2.商品ID,     MIN(T2.賞味期限),     T2.価格ID    FROM     表2 T2 GROUP BY     T2.商品ID,     T2.価格ID   ) T;

回答No.2

R8.1.xでなく、R8.0.xですか... select T2.価格ID from T2,T3 where T2.価格ID=T3.価格ID and (T3.商品価格,T2.賞味期限) in ( select T3.商品価格,min(T2.賞味期限) from T2,T3 where T2.価格ID=T3.価格ID group by T3.商品価格 ) とか select T2.価格ID from T2,T3 where T2.価格ID=T3.価格ID and not exists ( select 1 from T2 X2,T3 X3 where X2.価格ID=X3.価格ID and X2.価格ID=T2.価格ID and X3.商品価格=T3.商品価格 and X2,賞味期限<T2賞味期限 ) とかで出来るんじゃないですかね。 テストしてないですけど。

回答No.1

「三つのテーブルからの集計」というタイトルですが、この質問内容だと、表1を結合する必要はないのでは? 「表1に商品名があり、商品IDを商品名に変換」なら、3表の結合が必要になりますが。

関連するQ&A

  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文の構築について教えてください。

    SQL文の構築について教えてください。 こんばんは。Oracle9iのデータベース検索で、どうしてもSQLが思い浮かばないため、質問させていただきます。 ■Table ID    NUM   SIGN 100   1    A 100   2    A 101   1    A 102   1    B 103   1    B 104   1    C 首キーはID、NUMです。 上記のようなテーブルで、 IDが同一かつNUMが最大のもので、 SIGNが同一のレコードで、2件以外のレコードを抽出したいです。 (例表でいうと、ID104のレコードのみが抽出されるようにしたい) すこし急ぎなんですが、SQLが得意でお時間がある方、力を貸していただけないでしょうか。 よろしくお願い致します。

  • こちらのテーブルにあってこちらのテーブルにないIDを抽出するSQL

    お世話になってます MySQLでデータを格納しております。 以下のようにUserTable,Userinfoという2つのテーブルがあったとします。 ■UserTable -ID(key) -username ■Userinfo -ID(key) -user_info1 -user_info2 UserTableはユーザID作成時に自動でレコードが生成されます。 登録されたユーザは自分の情報を自分自身で登録することにより Userinfoテーブルにレコードが生成されます。 ここで、ユーザIDを作成したユーザのうち、自分の情報を登録していない ユーザIDを抽出したいのですが、この場合、どのようなSQLを書けばよいのでしょうか・・・? ユーザIDが、UserTableにあって、UserInfoにない、というものを作ればよいのですが・・・ SQLだけじゃ無理でしょうか・・・?

    • ベストアンサー
    • MySQL
  • これを抽出するSQLを教えてください

    どういうSQLを書けばこれが実現出来るのか分からないので教えて下さい。 テーブル名 f_table というテーブルがあります。 このテーブルには、f_id,u_id,day(日付)という三つの列があり、下記のようにデータが入っているとします。 f_id  u_id    day   1    1   2007/3/8 2    2   2008/1/2 3    2   2008/1/10 4    1   2007/2/12 このf_tableから、各u_idで一番日付の新しいf_idを抽出する(この表の場合f_idの1と3が抽出される)にはどういうSQLで出来るのでしょうか? ※実際の表ではu_idに入っている数字の種類は1と2だけではなく、もっと沢山あります。 ご回答よろしくお願いします。

  • SQLコマンドによるデータ抽出について

    例えば 商品マスタという商品ID、商品名、単価のフィールドを含んだテーブルと 販売履歴というID、商品ID、販売日時というフィールドを含んだテーブルがあります。 各商品の一番最後に売れた販売日時を知るために この2つのテーブルからSELECT文で商品ID、商品名、販売日時の フィールドを結果として返すSQL文を作りたいです。 各商品なので全く売れていない商品でも商品IDと商品名だけは結果に欲しいです。 どなたかSQLに詳しい方、教えてください。

  • ORACLEでのSQL、シンプルな方法は?

    ORACLEでのSQL文について質問です。 SQLで条件に合うレコードがあるかどうかはどう判別するのでしょうか? 画面で2つの条件を選んで テーブル ・ステータス ・フラグ 条件に合うレコードがなければINSERT 条件に合うレコードがあればUPDATE レコードが元々あるが、画面で指定された条件から外れる場合はDELETE としたいのですが、うまくSQLが書けません。 レコードがあればupdate、なければinsertするというのは多いのですが。 何かシンプルな方法はないでしょうか。

  • あるテーブルの内容を基準にして違うテーブルを更新するSQL文

    教えて下さい。 あるテーブルに下記の内容があります。 ID│名称 ─┼─── 1│花 2│木 3│水 もうひとつのテーブルには、 ID│名称 ─┼─── 1│海 3│水 4│空 となっています。 最初のテーブルの全レコードを対象に、最初のテーブルのIDと同じ値がもうひとつの テーブルにある場合、もうひとつのテーブルをUPDATEし、存在しなければINSERTしたい です。 結果を ID│名称 ─┼─── 1|花 2│木 3│水 4│空 を期待しています。 このようにするSQL文を教えていただけませんでしょうか。 よろしくお願いします。

  • 2つのテーブルを比較して、不一致レコードを抽出するSQL文

    2つのテーブルを比較して、不一致レコードを抽出するSQL文を教えてください。まったくの初心者なので、よろしくお願いします。

  • テーブルの権限について

    オラクル8.1.6を使っています。ていうか商品名は関係ないと思うのですが、 SQL文でテーブルを作るときに2つの列を併せて1つのプライマリキーにする文はどうやって書けばよろしいのでしょうか? 文を詳しくよろしくお願いします。

  • この場合のSQL構文を教えてください(MYSQL5.0)

    お世話になります。下記の場合どうしたらできるかどうか教えてください。 ・商品リストテーブル  商品ID(int primary key auto_increment )  商品名(char) ・受注リストテーブル  受注ID(int primary key auto_increment )  商品ID(int)  注文者(char) 上記のように二つのテーブルに分かれています。 (1)新商品の注文が入ると、商品リストテーブルにレコードがINSERTされ 受注リストにも同時にINSERTされるとします。 (2)すでに商品リストテーブルに登録済みの商品名の場合は受注リストテーブルのみINSERTされます。 この場合、商品リストの商品IDは自動インクリメントされるので問題ないですが、受注リストの商品IDはインクリメントされません。 商品リストに新レコードができると、このリストの商品IDは新しい番号がふられますが、この新しくできた番号を受注リストの商品IDに同時にいれたいのです。 ○方法として 二つのテーブルをJOINしてレコードをINSERTできるのならしたいのですが、どうゆうSQL文を書けばいいのかわかりません。 またその方法以外にとりあえず商品リストテーブルにだけINSERTしてそのタイミングで受注リストテーブルにトリガでINSERTとかする方法もありなんでしょうか? できればJOINした方にINSERTする方法でやりたいのですが、無理なら後者のほうでもいいんですが・・・。 SQL文わかる方どうかよろしくお願いいたします。

    • ベストアンサー
    • MySQL