• ベストアンサー

副問い合わせで複数の列を返す

こんにちは、Makotoと申します。 SQLの副問い合わせで質問があるのですが、 現在のSQLは CREATE OR REPLACE VIEW VIWTEST AS SELECT KOMOKU1, KOMOKU2 (SELECT SUM(KOMOKU3) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU4) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU5) FROM TBL WHERE A = 1 FROM M_TBL; という感じのSQLなのですが、副問い合わせの所 が見ているテーブルも条件も一緒なので1つにまとめたいのですが、うまくいきません。CURSORという関数があったのですが、VIEWでは使用できませんでした。なにかよい方法はないでしょうか? 開発環境は oracle 9i(AIX) pro*C/C++ でおこなっています。

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

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

  • ベストアンサー
回答No.3

集合関数を使用していることから直積でも問題がないかと思います。 CREATE OR REPLACE VIEW VIWTEST AS SELECT A.KOMOKU1,A.KOMOKU2,B.KOMOKU3,B.KOMOKU4,B.KOMOKU5 FROM M_TBL A, (SELECT SUM(KOMOKU1) KOMOKU1, SUM(KOMOKU2) KOMOKU2, SUM(KOMOKU3) KOMOKU3 FROM TBL WHERE A = 1) B ; 1999構文では CREATE OR REPLACE VIEW VIWTEST AS SELECT A.KOMOKU1,A.KOMOKU2,B.KOMOKU3,B.KOMOKU4,B.KOMOKU5 FROM M_TBL A CROSS JOIN (SELECT SUM(KOMOKU1) KOMOKU1, SUM(KOMOKU2) KOMOKU2, SUM(KOMOKU3) KOMOKU3 FROM TBL WHERE A = 1) B ; いかがでしょうか?

mako-kwnsh
質問者

お礼

お返事ありがとうございました。 kazuho_gooさんに書いていただいたSQL のような感じで、FROM句に複数の列が返る 副問い合わせを書き、それに名前をつけ SELECT句で指定してやるとうまく取得することが できました。 ありがとうございます。

その他の回答 (2)

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.2

#1です。 ごめんなさい。副問い合わせで複数の列を返そうとするとエラーとなってしまいますね。 違う方法を考えてみます。思いついたらまた回答しますね。

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.1

外してたらごめんなさい。 CREATE OR REPLACE VIEW VIWTEST AS SELECT KOMOKU1, KOMOKU2, (SELECT SUM(KOMOKU3), SUM(KOMOKU4), SUM(KOMOKU5) FROM TBL WHERE A = 1) FROM M_TBL; で、単純に良いような気がするのですが・・・。 何故KOMOKU3~5をそれぞれ副問い合わせを分けているのですか?

mako-kwnsh
質問者

お礼

お返事ありがとうございます。 はじめは私もそう思ってやってみたのですが、 上記の感じSQLを実行すると複数の問い合わせで エラーになってしまいました。でいろいろ試行錯誤 した結果別々の副問い合わせになってしまいました。

関連するQ&A

  • 副問い合わせについて

    お世話になります。明日から仕事で使うのですが、下記の構文が よく理解できません。宜しくお願い致します。 SQL Severは経験ありません。 経験はInfomixSql,Access,MySql程度です。 (1)行副問い合わせ(副問い合わせの結果が1行n列で返ってくる) SELECT * FROM t1 WHERE (c4, c2) = (SELECT MAX(c1), 'a' FROM t2); このwhere節の結合条件はどのような感じになるのでしょうか? (2)表副問い合わせ(副問い合わせの結果がm行n列(表)で返ってくる) SELECT * FROM t1 WHERE c4 IN ( SELECT c1 FROM t2 WHERE c4 >= 10 ) ORDER BY c1; 、 SELECT x1.c1, x2.y4 FROM t1 x1, ( SELECT c3, SUM(c4) AS y4 FROM t2 GROUP BY c3) AS x2 WHERE x1.c3 = x2.y4 ORDER BY c1; (1)に同じです。 参考になりそうなサイトでも結構ですので 宜しくお願い致します。

  • PL/SQL)Functionの引数(文字列)をWHERE文に記述する方法

    PL/SQLで、Functionの中で実行するselect文のWhereに、Functionの 引数で受けとった値をセットしようとしています。 この引数が文字列(VARCHAR2型)の場合、どのようにWHEREで、記述したらよいのでしょうか? ご教授のほどをよろしくお願いします。 CREATE OR REPLACE FUNCTION Fn_TBL_AAA (psCODE IN VARCHAR2) IS CURSOR TBL_AAA_CUR IS SELECT * FROM TBL_AAA WHERE BBB = psCODE ; TBL_AAA_REC TTBL_AAA_CUR%ROWTYPE;       :       : ※上記のように記述すると、実行ではエラーが発生しないのですが、  取得したい結果が返ってきません。TABLE(TBL_AAA)のBBBは、  VARCHAR2なので、通常のSQL*PLUSのSELECT文ではBBB = psCODE  はBBB = 'psCODE'のように [']で括るのですが、PL/SQLの  FUNCTION内ではどのように記述すればよいのかが  わかりません。 以上、よろしくお願いいたします。

  • まだSQL初心者なので、よくわかっていないようです。

    まだSQL初心者なので、よくわかっていないようです。 Viewの作り方がうまくいきません。 各テーブルの数値(PLAYCNT)の合計数を出力する VIEWを作成したいだけなのですが。。 これ↓を実行すると、mysqladminがフリーズしたようになって レコード数に~02(2は乗数) という変な数字が入ってしまいます。 これはいったいどうしてなのか分からず困っています。 CREATE VIEW ALLPLAY_TBL AS SELECT SUM(A.PLAYCNT) NORMAL_CNT, SUM(B.PLAYCNT) HARD_CNT, SUM(C.PLAYCNT) SPECIAL_CNT, SUM(D.PLAYCNT) MANIAC_CNT FROM NORMAL_TBL A, HARD_TBL B, SPECIAL_TBL C, MANIAC_TBL D

  • 副照会を簡単に使いまわせますか?

    たとえば、次のSQLがあったとして、 select キー1, キー2, sum(金額) (  select A.キー1 , A.キー2 , A.金額   from (select * from ~ where ...) A  union all  select '' , A.キー2 , A.金額   from (select * from ~ where ...) A  union all  select A.キー1 , '' , A.金額   from (select * from ~ where ...) A  union all  select ''   , '' , A.金額   from (select * from ~ where ...) A ) group by キー1, キー2 一番内側の副照会は、 (select * from ~ where ...) A は、4箇所とも同じSQL文で、とても長いのですが 2箇所目以降は、1箇所目と同じSQL文ということで 記述を省けたりするような構文があったりしないでしょうか? そこを、ビューにしろといわれるとその通りなのですが ビューにしたくないです。(プログラムで動的にここの副照会部分を パラメータに応じて作っているので、ビューにするとビューがいくつも できて、きりがない) Oracle9iで、利用しています。

  • IN句に副問合わせを使う場合と使わない場合

    お世話になります。 SQLについての質問です。 RDBMSはSymfowareです。 IN句に副問い合わせを指定するSQLと その副問い合わせの結果を直接IN句に記載したSQLで 結果が異なってしまいます。 こういうことってありますでしょうか。 以下のようなSQLです。 (1) SELECT * FROM T1 WHERE T1.column_A IN ( SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX' ) 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。 (2) SELECT * FROM T1 WHERE T1.column_A IN ('A','B','C','D') この(1)、(2)のSQLの結果が異なってしまいます。 私の環境では(1)では0件、(2)では2件ヒットします。 なぜこのようになるのかわかる方がいらっしゃいましたら ご教授ください。 ちなみに、DBを操作して、副問い合わせのSELECT文の結果を 'A'、'B'とすると同じ結果が得られます。 副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの 結果は0件になってしまいます。 RDBMSの障害でしょうか・・・? それとも、IN句に副問い合わせを使用する場合、 その副問い合わせの結果は2件以下にする必要がある なんてルールがあったりするのでしょうか。

  • Access2007でSQLの複数列副問い合わせについて

    VB2005+Access2007を使用しております SQL文の複数列副問い合わせについて教えて下さい 検索をしても他のデータベースのものばかりヒットし、解決できません SELECT * FROM Uriage WHERE (Date, DateID) = (SELECT Date, DateID FROM Uriage WHERE NAME = 'cup') これを実行すると 「メイン クエリの FROM 句の予約語 EXISTS を使用しないフィールド を複数返すサブクエリを作成しました。サブクエリのSELECT ステート メントを変更し、1 つのフィールドだけを指定してください。」 というエラーがでてしまいます。 形をかえ、 SELECT * FROM Uriage WHERE Date = (SELECT Date FROM UriageList WHERE NAME = 'cup') AND DateID =(SELECT DateID FROM UriageList WHERE NAME = 'cup') これを実行すると、 「このサブクエリでは 1 つのレコードしか返せません。」 というエラーがでてしまいます。 また、 SELECT * FROM Uriage WHERE (Date) IN (SELECT Date FROM UriageList WHERE NAME = 'cup') AND (DateID) IN (SELECT DateID FROM UriageList WHERE NAME = 'cup') を実行したところ、 エラーはでないものの、抽出結果が異なるものが出てきてしまいました。 これを解決するにはどのようにしたらよいのでしょうか? よろしくお願いいたします。 なお、某知恵袋にも同様の質問をしてしまいましたが、 回答者様への回答や追加質問が出来ず、 こちらに再質問させて頂きました。申し訳ございません。

  • SELECT * FROM tbl WHERE a = ?;

    SELECT * FROM tbl WHERE a = ?; 上記のSQL文で、?の部分がnullだとWHERE条件を無い状態に(SELECT * FROM tbl) のようにするにはどうすればいいでしょうか?

  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL
  • 複数の副問合わせにて、一つだけデータがない場合の対処法は?

    テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。 そして以下のようなSQLを作りました。 SELECT TBLA.SURYO_1 ,TBLB.SURYO_2 , TBLC.SURYO_3 ,TBLD.SURYO_4 FROM (SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA, (SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB, (SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC, (SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は データがないことにより、SQLを実行すると、対象データがないという結果となります。 当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、 出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ を取得する方法はありますでしょうか? よろしくお願いします。

  • カーソルで値取得

    あるテーブルから頭から10件分 カーソルで値を取得するようにしていましたが、 元々下記のようだったものを… CURSOR cursor_name IS SELECT TBL_A.E_ID,TBL_A.C_ID FROM (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10;     ↓ CURSOR cursor_name IS SELECT TBL_A.E_ID, TBL_M.S_ID, TBL_M.S_NAME, TBL_U.USER_ID FROM ((TBL_A INNER JOIN TBL_EU ON TBL_A.E_ID = TBL_EU.E_ID) INNER JOIN TBL_U ON TBL_EU.S_ID = TBL_U.S_ID) INNER JOIN TBL_M ON TBL_EU.S_ID = TBL_M.S_ID WHERE (((TBL_EU.DIVISION)="2")); というように取得する値をふやしたいのですが、元にあった (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10; をどこに組み込んでいいのかわらず困っております。 どなかた教えて頂けないでしょうか?お願いいたします。