• ベストアンサー

複雑なSQLを1本でまとめたい

Oracle10gで開発をしています。 1本のSQLで下記のような結果を返したいのですが、 やり方がわかりません。 どなたかご教授頂けないでしょうか? Aテーブル No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 3   003   b001  10    10 4   004   c001  5     2 5   005   d001  20    0 SELECT * FROM Aテーブル WHERE 在庫数 - 注文数 > 0 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 4   004   c001  5     2 5   005   d001  20    0 となりますが、 これを 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 4   004   c001  5     2 5   005   d001  20    0 という風に、1番目の結果+1番目の結果にある商品の 他レコードも抽出したいのですが、どうしたらよいでしょうか?

  • Oracle
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.1

SELECT * FROM Aテーブル a WHERE EXISTS(SELECT 1 FROM Aテーブル b WHERE 在庫数 - 注文数 > 0 AND a.品番 = b.品番)

mariko0930
質問者

お礼

EXISTSというやり方があるのですね。。。 早速試してみます。 ありがとうございました。

その他の回答 (1)

回答No.2

ご自分で書いたとおり、 (1)一番目の結果を求める。 (2)1番目の結果から再度対象を検索する とすれば良いわけで、次のようなSQLで良いかと思います。 select * from Aテーブル where 品番 in (select 品番 from Aテーブル where 在庫数 - 注文数 > 0)

mariko0930
質問者

お礼

WHERE句でINしちゃえばいいのですね。。。 k_o_r_o_c_h_a_n様のように(1)、(2)と順を追って、 考えなくてはいけませんね。。。 ありがとうございました。

関連するQ&A

  • Oracle9i SQLについて

    Oracle9i SQLについて 環境:WinXP(SP3),Oracle9i,VB2005 受注のテーブルから未出荷で品番毎に一番早い納期の 受注数を取得したいのですが上手くいきません ご教授願います。 SQL出力結果イメージ 品番  納期   受注数 A 2010/06/01 6 B 2010/05/26 10 C 2010/05/24 1

  • SQL

    SQLの初心者です。 次のようなテーブルがあるとします。 項目:A , B , C , D このテーブル合計を求めたいのです。 条件は、 同一テーブルでB=10の時のAの合計とD=10の時のCの合計の合計です。 B=10の時のAの合計は「sql sum(A) from テーブル where B=10」となります。 D=10の時のCの合計は「sql sum(C) from テーブル where D=10」となります。 この2つの合計を求めたいのです。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQLに関して

    環境:Oracle 11g SQLで階層問い合わせに関して教えて下さい。 今、ある部品テーブルに対し、直下のレコードのみを抽出しようとしていますが、ある共通の 構成をA部品群、B部品群の中に入れた場合、なぜか同じ結果が2回表示されてしまいます。 以下にサンプルのデータとSQLを作成しましたので、何がおかしいか教えて頂きたいと思います。 【Aテーブル】 品目番号,親品目番号 A A1,A B,A B1,B ↑ A部品群 C D,C B,C B1,B ↑ B部品群  ※ Bが共通の構成です。 【SQL】 select 品目番号 as 下位品目番号,親品目番号 from A_TABLE where 品目番号 != 'B' AND 親品目番号 = 'B' start with 品目番号 = 'B' connect by prior 品目番号 = 親品目番号 【結果】 下位品目番号,親品目番号 B1,B B1,B 2回表示されてしまいます。 単純に親品目番号=’B’としてしまえば正しく拾えますが、上記のSQLを多様している為、 何が間違っているか教えて頂ければと思います。 初歩的な質問で申し訳ありませんが、教えて下さい。

  • オラクル結合SQL

    こんばんわ。オラクル初心者です。 オラクル9.1で、下記のようにtable1とtable2を結合して、view1(oracleビュー) を作成したいのですが、どのようなSQLがよいでしょうか。 なかなかうまい方法がなくてこまっています。 table1 no 項目 その他 その他1 1   1 1  2 1  3 .....省略 table2 no 項目 種別 結果 1  1  01  3 1  1  02   8 1  1   03  7 1  2  01  9 1  2   02   6 1  2  03  2 1  3  01   1 ...... view1 良い例 no 項目 結果1 結果2 結果3 1   1   3   8   7    ←種別01 02 03を順にいれる 1   2  9   6  2 1  3  1............ select table1.no,table1.項目,・・・ from table1,table2 where table1.no = table2.no and table1.項目 = table2.項目 ↑おおよそこのような感じになるとは思ってます。 何とか頑張ったのですが、下記のようになってしまうことが 多かったです・・・。どこかSQLがわるいようです。 view1 悪い例 no 項目 結果1 結果2 結果3 1  1   3   8  7 1  1   3   8  7 1  1   3   8  7 1   2  9  6  2 1   2  9  6  2 1   2  9  6  2 1   3  1............ もしご存知の方いらっしゃいましたら、助かります。よろしくお願いいたします。

  • SQLの問題です。

    以下のような二つのテーブルがあります。 社員テーブル 社員番号 社員氏名 1     花子 2     太郎 所属テーブル 社員番号 所属番号 1     10 1     20 2     30 欲しいのは以下の結果です。 1 花子 2 太郎 以下のSQLを実行すると、 SELECT distinct a.社員番号, a.社員氏名, b.所属番号 FROM 社員 a,所属 b where a.社員番号 = b.社員番号 order by 所属番号 1 花子 1 花子 2 太郎 となってしまいます。 先に述べたとおりの結果を取得するにはどういうSQLを書いたらいいでしょうか? お知恵を貸してください。宜しくお願いします。 Oracle8iを使用しています。   

  • GROUP化した時の最適なSQL文の書き方

    いつも勉強させて頂いています。 GROUP化した時に応答時間がかかるので、 短縮したいのですが、方法をご教示願います。 SQLSERVER2005 EXPRESS VB2008 テーブルA(注文NO、手配日付、品名、手配数) テーブルB(入荷NO、注文NO、入荷数、単価) テーブルAの注文NOに対して複数の入荷があります。 テーブルAの注文NOに対して未入荷の場合も「0」で出力します。 出力(注文NO、品名、入荷累計、平均単価、合計金額) SQL文を書く時に、注文NOでGROUP化してから抽出(手配日付)すると レコード件数が多いため、応答時間がかかってしまいます。 どのような書き方がよろしいでしょうか? この書き方では、時間がかかります。 SELECT テーブルA.注文NO, テーブルA.手配日付, テーブルA.品名, テーブルB2.入荷数, テーブルB2.単価 FROM テーブルA LEFT OUTER JOIN (SELECT 注文No, SUM(入荷数) AS 入荷数, AVG(単価) AS 単価 FROM テーブルB GROUP BY 注文No) AS テーブルB2 ON テーブルA.注文NO = テーブルB2.注文No WHERE (テーブルA.手配日付 = '2008/01/01') すべてのレコードをグループ化してから処理しているため、遅いと思います。 よろしくお願いいたします。

  • SQL 重複しないJoinの仕方を教えてください

    データが重複しないSQL文の書き方を教えてください。 下記のような2つのテーブルがあり、「管理番号」でOnして「使用数」をJoinさせ、かつ重複しないようにSQLを作成したいのですが、MySQLで可能でしょうか? ※0002に関しては、テーブル2の方がデータ数が多いため、Join後は2行になって「使用数」は重複せず、「数」の部分には0が入ればベストです 【テーブル1】 日付    品番  管理番号 数 2012/6/12 A987  0001 500 2012/6/14 A987  0001 300 2012/6/16 A987  0001 400 2012/6/18 A987  0001 800 2012/6/12 A987  0002 750 2012/6/12 A987  0003 540 2012/6/14 A987  0003 740 2012/6/16 A987  0003 840 2012/6/18 A987  0003 240 2012/6/20 A987  0003 640 【テーブル2】 日付    品番  管理番号 使用数 2012/7/10 A987  0001 160 2012/7/11 A987  0001 260 2012/7/10 A987  0002 220 2012/7/12 A987  0002 320 2012/7/20 A987  0003 530 2012/7/22 A987  0003 430 2012/7/24 A987  0003 830 【テーブルJoin】 日付    品番  管理番号 数 使用数 2012/6/12 A987  0001 500 160 2012/6/14 A987  0001 300 260 2012/6/16 A987  0001 400 0 2012/6/18 A987  0001 800 0 2012/6/12 A987  0002 750 220 2012/6/12 A987  0002 0 320 2012/6/12 A987  0003 540 530 2012/6/14 A987  0003 740 430 2012/6/16 A987  0003 840 830 2012/6/18 A987  0003 240 0 2012/6/20 A987  0003 640 0

  • SQL '%@'とは?

    こんばんわ。 SQLの質問なのですが、 SELECT * FROM aテーブル WHERE aテーブル.番号 IN '%@' というSQL文が 学校で使われていましたが、 '%@'とは何を指すのでしょうか? 調べても分からなかったので ご教授願います。

  • SQL

    以下のような売上テーブルから、 「2009年のデータ」と「2008年と比較した2009年の売上数の増減」を 取得したいです。(商品の昇順で) 取得できるSQL文を教えていただきたいです。 どうぞよろしくお願いいたします。 <売上テーブル> 年, 商品, 売上数 --------------- 2008, A, 30 2008, B, 20 2008, C, 20 2009, A, 10 2009, C, 40 2009, D, 50 <結果>↓ 商品, 2009年の売上数, 増減 ------------------------- A, 10, -20 B, , -20 C, 40, 20 D, 50, 50

  • ACCSESSのSQLで教えてください。

    すみません! SQL初心者なのですが教えてください。 下記のようなtableというテーブルなのですが こちらのテーブルをデータが増加しても(1)から(2)のように select表示させるにはどうすればよいか教えて頂けないでしょうか・・・。 何卒よろしくお願い致します。 テーブル名:table カラム名:NO,kigou (1) table |NO|kigou| |1 |a | |2 |b | |3 |c | |4 |d | |5 |e | ↓ (2) |NO1|kigou1|NO2|kigou2|NO3|kigou3| |1 |a |2 |b |3 |c | |4 |d |5 |e | ・・・