• 締切済み

各行が一意でないテーブルの自己結合について

各行が一意(ユニーク)では無い表の自己結合 テーブルの結合についてご質問させてください。 テーブル「P」から、自己結合して、テーブル「Q」を作ります。 (下記参照) しかし、私の作成したSQLでは、テーブル「R」になってしまいます。 例 テーブル「P」: type data1 data2 price A ああ いい 100 A ああ いい 200 A ああ いい 300 B いい ああ 400 B いい ああ 200 テーブル「Q」 DATA(A1) DATA(A2) price(A) DATA(B1) DATA(B2) price(B) ああ いい 600 いい ああ 600 テーブル「R」 DATA(A1) DATA(A2) price(A) DATA(B1) DATA(B2) price(B) ああ いい 1800 いい ああ 1200 使用したSQL select P1.data1 as DATA(A1), P1.data2 as DATA(A2), SUM(P1.price) as price(A), P2.data2 as DATA(B1), P2.data1 as DATA(B2), SUM(P2.price) as price(B) from P as P1,P as P2 where P1.data1 = P2.data2 AND P1.data2 = P2.data1 group by P1.data1, P1.data2, Q1.data1, Q1.data2; 使用したSQLでは、where句での絞り込みが原因で、同じtypeで繰り返し集約してしまっているため、 目標のテーブルを作成することができませんでした。 上記のテーブル「P」のように、各行が一意でないものについては、どのように自己結合を 行えばよろしいのでしょうか。

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

みんなの回答

回答No.1

こんにちは。 カテゴリーがOracleなので、Oracleでいいのかな? バージョン不明ですが・・・。 まぁ、書き方はいろいろありますが・・・、 SELECT P1.data1 as DATA(A1), P1.data2 as DATA(A2), P1.price as price(A), P2.data1 as DATA(B1), P2.data2 as DATA(B2), P2.price as price(B) FROM (SELECT data1, data2, SUM(price) as price FROM P WEHERE type = 'A' GROUP BY data1, data2) P1, (SELECT data1, data2, SUM(price) as price FROM P WEHERE type = 'B' GROUP BY data1, data2) P2 っちゅう事じゃないのかな? 根本的に間違ってる???

関連するQ&A

  • 自己結合の使い方

    自己結合の使い方 下記URLにて自己結合の記事を読んでいました。 http://codezine.jp/article/detail/460?p=1 下記コードの「P1.name > P2.name;」の「>」の意味がよくわかりません。 不等号は大なり小なりで数値の比較をするのはわかります。 --組み合わせを得るSQL SELECT P1.name AS name_1, P2.name AS name_2 FROM Products P1, Products P2 WHERE P1.name > P2.name; ただ、この例題で比較されているのは文字列の比較をしているように思えるのですが、これはどういった意味になるのでしょうか?

  • SQLで、Join句で結合したテーブルにデータが無い場合について

    SQLについての質問です。 Join句を使ってテーブルを結合しています。 Aテーブル(社員データ)に存在する勤務区分フィールドの値に対応して、 Bテーブル(勤務データ)から勤務区分(一意)に対応したデータを持って来るSQLを作成したところ、 Bテーブルに存在しない勤務区分を持つAテーブルのデータは結果に出ませんでした。 このように、結合したBテーブルに対応するデータが無い場合でも、Aテーブルに存在するデータを全て出したい場合、 何か方法はあるのでしょうか? 現在は一度Aテーブルから全てのデータをセレクトした後に、1件1件ループしてBテーブルからセレクトする方法をしていますがもっと簡潔にできるなら簡潔にしたいと思っています。 どなたかお答え頂けると幸いです。よろしくお願いします。

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • 外部結合で表示されないレコードがある

    いつもお世話になっております。 SQLで3つのテーブルの結合をして、結果を得たいのですが、 空欄があるために表示されないレコードがあります。 どうすれば表示できるか、どなたか教えていただけないでしょうか? テーブルが A:明細(call_data) B:業者(m_price) C:料金(m_cust) とあり、 SELECT c.area_id, m.cust_id, p.price FROM call_data c, m_cust m, m_price p where c.calling_num = m.orig_opn_dgt(+) and m.cust_id = p.cust_id and p.area_id = c.area_id(+) ; としたのですが、A.明細データのarea_idで空欄のレコードは 出力されませんでした。 (+)を使うと外部結合で片方のデータを出力できると思ったのですが、それができないのは何が原因なのでしょうか? c_id a_id price 1 111 10.2 2 222 15.5 3 333 20 1 4 111 10.25 2 111 13.5 5 222 12 6 888 6 666 17.55 と出て欲しいところが c_id a_id price 1 111 10.2 2 222 15.5 3 333 20 4 111 10.25 2 111 13.5 5 222 12 6 666 17.55 とでます。 分かりづらくて申し訳ありません。 よろしくお願いいたします。

  • 巨大テーブルの外部結合

    巨大なテーブル同士を結合する際に、みなさんはどのように結合されますか?もっともパフォーマンスのある方法を模索しているところです。 テーブルA:約900万件 テーブルB:約400万件 テーブルAのインデックスはカラム:idです。 テーブルBにはインデックスはありません。 取得したいのはBテーブルに含まれるAテーブルのidの件数です。 select  count(id) from B where A.id = B.id なんてやると、数時間かかります。 select count(id) from B where exists(select * from A where A.id = B.id) ですと、約3hぐらいかかりました。 inで実行すると等価結合したときと変わらないぐらいになります。 こういう場合、皆さんはどう結合されていますか? お知恵を拝借できると幸いです。 ちなみにoracle 8iです。 よろしくお願いいたします。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 3テーブルの外部結合

    3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか?  ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>>   <<B_TBL>>     <<C_TBL>> A  STOCK   B  A NYUKA   C  A SYUKA a01  100    b01 a02 10   c01 a03 10 a02  200    b02 a01 20   c02 a01 20 a03  300    b03 a01 10   c03 a05 10 a04  400    b04 a03 30   c04 a01 30 a05  500    b05 a05 30   c05 a03 20            b06 a02 20   c06 a01 10            b07 a01 10   c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。

  • テーブルを結合して新規にテーブルに・・・

    アクセス2003でSQLを組んでデータベースを作っています。 まず、ユニオンクエリを使ってAクエリとBクエリを結合しました。 この結合したものを新規にテーブルを作成したいのですが、どうすれば良いでしょうか? 手順を教えて頂ければ幸いです。 よろしくお願いします。

  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • テーブル結合

    度々お世話になっています。 Mysqlのテーブル結合したいと思ってます。 テーブル構成は以下のとおりですのでご参照ください。 ■テーブルA id | name 1 | bind 2 | samba 3 | apache ■テーブルB id | detail 3 | test 3 | test 1 | test ■結合結果 id | count 1 | 1 2 | 0 3 | 2 テーブルA,Bはidコラムで紐づいています。 この際、テーブルBのidごとにレコード数を出力したいのですが、 どういったSQLを流せば良いでしょうか。 ご教示願います。

    • ベストアンサー
    • MySQL