ORACLE CROSS JOINについて

このQ&Aのポイント
  • ORACLE CROSS JOINについてのスマートな書き方を教えてください
  • [店舗M]の分類が[GPM]の大分類Bを対象にレコードを作成したい
  • 具体的なSQLの処理方法を教えてください
回答を見る
  • ベストアンサー

ORACEL CROSS JOIN について

いつもお世話になっております。 以下の処理を実現するSQLをACCESSで作成してみました。 結果は正しく求められるのですが、もっとスマートな書き方があるように思いますが、いい案が思いつきません。 よろしくお願いします。 (実際にはORACLE9iを使って、PL/SQLで行う予定です・・・ORACLEに適切なSQLを教えて下さい) ●【店舗M】にある分類より、【GPM】の大分類が"B”を対象に、ディーラ・ナンバ毎のレコードを作成する 【店舗M】 │店舗│分 類│ ┼──┼───┼ │A店│ 1 │ │B店│ 2 │ │C店│ 2 │ │D店│ 2 │ │E店│ 1 │ │F店│ 4 │ 【GPM】 │ナンバ│分 類│大分類│ ┼───┼───┼───┼ │ G1 │ 1 │ A │ │ G1 │ 2 │ A │ │ G1 │ 4 │ A │ │ G2 │ 1 │ B │ ※処理対象 │ G2 │ 2 │ B │ ※処理対象 │ G3 │ 2 │ B │ ※処理対象 │ G3 │ 3 │ B │ ※処理対象 │ G4 │ 4 │ B │ ※処理対象 │ G5 │ 1 │ B │ ※処理対象 │ G5 │ 2 │ B │ ※処理対象 │ G5 │ 3 │ B │ ※処理対象 │ G6 │ 4 │ C │ ーー結果ーー 【B店舗別ナンバ】 │店舗│ナンバ│大分類│ ┼──┼───┼───┼ │A店│ G2 │ B │ │E店│ G2 │ B │ │B店│ G2 │ B │ │C店│ G2 │ B │ │D店│ G2 │ B │ │B店│ G3 │ B │ │C店│ G3 │ B │ │D店│ G3 │ B │ │F店│ G4 │ B │ │A店│ G5 │ B │ │E店│ G5 │ B │ │B店│ G5 │ B │ │C店│ G5 │ B │ │D店│ G5 │ B │ -SQL-  INSERT INTO B店舗別ナンバ ( 店舗, ナンバ, 大分類 )   SELECT 店舗M.店舗, GPM.ナンバ, GPM.大分類   FROM   ( SELECT 店舗M.* FROM 店舗M   WHERE EXISTS ( SELECT * FROM GPM WHERE GPM.分類 = 店舗M.分類 )),   ( SELECT GPM.* FROM GPM   WHERE EXISTS ( SELECT * FROM 店舗M WHERE 店舗M.分類 = GPM.分類 ))   WHERE GPM.大分類 = B ;

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

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

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

こんばんは。 単純にくっつければいいだけだと思うのですが・・・。 SELECT 店舗M.店舗, GPM.ナンバ, GPM.大分類 FROM 店舗M, GPM WHERE GPM.大分類 = 'B' AND GPM.分類 = 店舗M.分類 1対多の結合は、勝手に行が増えるので、ご希望通りの結果になりますが・・・。

関連するQ&A

  • WHERE句はJOIN結合前結合後どちらに効くのか

    以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。 先に抽出して結合した方が良いと昔聞いた事がありましたが 記憶があいまいになってしまいました。 (1) SELECT * FROM A JOIN B ON A.*** = B.*** WHERE A.*** = '0001' (2) SELECT * FROM (SELECT * FROM A WHERE A.*** = '0001') AS A JOIN B ON A.*** = B.***

  • ちょっと見かけないinner joinについて

    どなたか以下の構文について教えて下さい。 どこのDBMSで使用されるものなのでしょう? SELECT B.項目1, B.項目2, A.項目2, A.項目3 FROM ( ( SELECT * FROM Bテーブル WHERE 項目3>"1" ) B INNER JOIN ( SELECT * FROM Aテーブル WHERE 項目2=10 ) A ON B.項目1=A.項目1; 意味はわかるのですが、普通のinner joinとは違うもので。

  • 1つのSQLにしたいです

    1つのSQLにしたいです 以下のSQLを1つにしたいです。 select a, b, c, '1' event_type from sample where type = '1' select a, b, c, '2' event_type from sample where type = '2' select a, b, c, '3' event_type from sample where type = '3' ポイントはselect分に結果によって'1'、'2'、'3'といれたいです。 初心者的質問で申し訳ありません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • LEFT JOINの記述の仕方について

    お世話になっております。 LEFT JOINの記述の仕方でご確認したい事があります。 ご教授頂けますようお願いいたします。 【ご質問内容】 以下のようなSQLをLEFT JOINを使用して記述する場合、 どのように記述すればよろしいのでしょうか? SELECT A.* FROM A B C WHERE A.COLUMN1 = B.COLUMN1 AND B.COLUMN2 = C.COLUMN2(+) AND B.COLUMN3 = C.COLUMN3(+) AND A.COLUMN4 = C.COLUMN4(+) ;

  • from...where を from...join..on にするには

    以下のSQL文は from ... where ... で書かれていますが これを from ... join ... on ... で書き直したいのですが可能でしょうか? select X.col1, U.col1 from TABLE_X as X ,TABLE_U as U where U.REC_NO = (select B.REC_NO from TABLE_A as A, TABLE_B as B where A.ITME = B.ITEM and X.DATA = A.DATA fetch first 1 row only ) むずかしくしているのは、fetch first 1 row only なのですが これがないと where句のかっこのなかのselect文は複数の結果を返します しかし、その複数の結果はすべて同じものになることがデータ上保証されています 。 fetch first を除いて select distinct としても同じ結果となりますが パフォーマンスがひどく低下してしまいます。

  • PostgreSQLでサブクエリーをJOINする方法

    たとえば、 select A.field1, B.field1 from (select field1 from table1 where field2='x') A, (select field1 from table2 where filed2='y') B where A.field2=B.field2; のようなことをしたいのですが、 Oracleだとこの方法でデータを取ってこれるのですが、PostgreSQLだとエラーで返ってきてしまいます。 PostgreSQLのバージョンは6.5.3です。 バージョンが上がると上記の書き方も通るようになるのでしょうか? また、上記の書き方と同じ意味を持つ他の書き方をご存知でしたら教えてください。よろしくお願いします。

  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL : たしかに DELETE したの?

    ありがちな処理かと思いまして質問させていただきます。 SQLで DELETE を行う際、WHERE で絞り込んだ対象行がなくても、  「エラーは返ってこない」 ということですが、NOT FOUND判定はするのでしょうか。 ごく単純に、削除しようとしたデータが実際にあったのかを確認したいのです。 やろうとしている処理は、次のようなものです。 DELETE FROM a_tbl WHERE NOT EXISTS (SELECT row1 FROM b_tbl WHERE row1 = 'input_data' ) AND NOT EXISTS (SELECT row1 FROM c_tbl WHERE row1 = 'input_data' ); ようするに、他のテーブルに、すでにない行であることが前提で、 a_tbl から DELETE したことを確認したいのです。 Pro*C内で実行するのですが、一般に同じだと思います。 キホンのキかもしれませんが、よろしくお教えください。

  • WHERE文の中で除算

    SQLのWHERE文の中で計算をしているのですが、「除数が0です」とのエラーがでてしまいます。 同じ計算をSELECT文の中にいれると、エラーにならず、計算結果がでるのですが、どうしてでしょうか? SELECT DATA, (A + B - C) / (A + B) * 100 FROM table ↑この時は計算結果がでます。 SELECT DATA FROM table WHERE (A + B - C) / (A + B) * 100 <= 50.0 ↑「除数が0です」といわれてしまいます。