• ベストアンサー
  • すぐに回答を!

複数テーブルの結合及び評価させることは可能???

SQLで3つのテーブルを結合させた上に、データを評価させることは出来ますでしょうか?(SQL99準拠) イラストのようなテーブル構成になっています。 http://photozou.jp/photo/show/2140834/105850985 GAKUREKIテーブルのG_JISSEKISHUKEIの数とJISSEKIテーブルのS_CODEとS_SHOZOKUのデータをgroup byしてcountした結果を 付きあわせたいと思っています。 通常であれば、GAKUREKIテーブルとJISSEKIテーブルを結合して比較するだけで良いかと思うのですが、 GAKUREKIテーブルのS_SHOZOKUとJISSEKIテーブルのS_SHOZOKUが結びつけることができません。 JISSEKIテーブルのS_SHOZOKUと結びつけることが可能なデータは、SHAINテーブルのS_ICHINENMAESHOZOKUです。 このような結びつけをすることは出来ますでしょうか? いろいろ試してみたのですが、テーブルを複数くっつけるとエラーになる?のでしょうか・・・? ちなみにこのイラスト上のデータでデータを評価した場合、 GAKUREKIテーブルのS_CODEが、「1005」、G_JISSEKISHUKEIが「2」にも関わらず、 JISSEKIテーブルのS_CODE「1005」とS_SHOZOKU「ZZZ」のデータをgroup byしてcountした結果が、「1」のため不適切なデータと 言えます。 (※JISSEKIテーブルのS_CODE「1005」とS_SHOZOKU「S02」のデータの場合は問題なし) 複雑条件になってしまいますが、SQL単体で可能でしょうか? もしくは、何か別ソリューションを用いたほうが良いのでしょうか・・・ 対象DBはOracle10gです。(ちなみに普段はOra使用ですが、評価DBとしてそれぞれ最新版のSQLserver、MySQL、DB2、HiRDBを使ってみています。構文も変わりますか?)

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数310
  • ありがとう数2

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

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

3個のテーブルを結合して不具合があるなら、2個ずつ結合してunionして集計すると 大抵、大丈夫なはずです。 例)タブンこれでいいと思うけど(未検証です) select CODE,SHOZOKU,sum(JISSEKISHUKEI),count(NAME) from ( select sha.S_CODE CODE,sha.S_SHOZOKU SHOZOKU,gak.G_JISSEKISHUKEI JISSEKISHUKEI,Null NAME from SHAIN sha,GAKUREKI gak where sha.S_CODE = gak.S_CODE union all select sha.S_CODE CODE,sha.S_SHOZOKU SHOZOKU,0 JISSEKISHUKEI,jis.J_NAME NAME from SHAIN sha,JISSEKI jis where sha.S_CODE = jis.S_CODE ) group by CODE,SHOZOKU order by sha.S_CODE,sha.S_SHOZOKU ※count(NAME)で、NAMEがNULLのデータも計算されてしまうDBなら sum(case when NAME is null then 0 else 1 end) とすれば大丈夫。 ※最新バージョンなら大抵のDBは動くと思うけど。 でも、質問にある場合なら、 SHAINテーブルとGAKUREKIテーブルは1:1のようなので、 結合した結果とJISSEKIテーブルを結合してcountとって問題ないのでは? (SHAINテーブルとGAKUREKIテーブルが1:1でなければダメです。) 例) select sha.S_CODE,sha.S_SHOZOKU,gak.G_JISSEKISHUKEI,count(*) from SHAIN sha,GAKUREKI gak,JISSEKI jis where sha.S_CODE = gak.S_CODE and sha.S_CODE = jis.S_CODE group by sha.S_CODE,sha.S_SHOZOKU,gak.G_JISSEKISHUKEI order by sha.S_CODE,sha.S_SHOZOKU >最新版のSQLserver、MySQL、DB2、HiRDBを使ってみています。構文も変わりますか? 通常、関数を使っているとまず動きません! ただ、今回の場合は、union all や case くらいなので動くんじゃないかな。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます! 大変参考になる意見ありがとうございました。 おかげでもくてきをたっせいすることができました!

関連するQ&A

  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブルの結合について

    以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID

  • テーブルの結合について

    皆さん教えてください。 zaiko と testBと言うテーブルに商品IDカラムを入れておき この二つのテーブルを結合して商品データはあるけど 在庫がない物だけを抽出したいのですが、その場合どのような SQLになるでしょうか?? 商品データも在庫もある場合下記のSQLで商品情報と在庫データが 出てくるのですが、その逆と言うか、商品情報は登録してあるが、 在庫テーブルに登録されていない商品情報を検索したいと思っております。 select zaiko.*,product_data.* from zaiko inner join product_data on zaiko.nyuko_item_code = product.item_code ではどうかよろしくお願いします。

  • 複数のPKを持つテーブル同士の結合について

    以下のような2つのPKを持つテーブル同士で、お互いに存在しないPKのデータを抽出するときのSQLを教えて下さい。 以下のデータの場合、テーブルAではCODE_1がAAAAAのデータ、テーブルBではCODE_1がCCCCCのデータのことを指します。 [テーブルA] CODE_1 CODE_2 ----- --- AAAAA 123 BBBBB 123 [テーブルB] CODE_1 CODE_2 ----- --- BBBBB 123 CCCCC 123 PKがCODE_1だけの場合は、 select distinct テーブルA.CODE_1 from テーブルA,テーブルB where テーブルA.CODE_1 not in ( select テーブルA.CODE_1 from テーブルA,テーブルB where テーブルA.CODE_1 = テーブルB.CODE_1) で、AAAAAが抽出できるとこまでは分かったんですが、複数のPKになったらいきなり分からなくなってしまいました。 どうかよろしくお願いします。

  • 集計されたテーブルの結合

    SUM、AVGなどで集計された(group byを使って)テーブルを、LEFT JOINで結合するにはどうしたらいいですか?

    • ベストアンサー
    • MySQL
  • テーブル結合

    度々お世話になっています。 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
  • テーブルの集計+結合

    MySQL+ PHPについて質問です。 商品リスト(テーブルA)から、商品名で関連付けられたユーザー評価(テーブルB)があったとします。 ユーザーが商品ページから評価を5段階でを入れれるようにしました。 商品一覧のページで商品リスト(テーブルA)を表示させ さらにユーザー評価の平均を一緒にテーブルAの商品名から関連付けるように表示させたいのですが、どうやったらいいのでしょうか。 イメージは下記の通りです。 --------------------------------------------------------------- 商品名(テーブルA) ∥ 商品説明(テーブルA) ∥ 商品ランク(テーブルB) --------------------------------------------------------------- オレンジ | おいしい | 評価5 --------------------------------------------------------------- りんご | おいしい | 評価4 --------------------------------------------------------------- 試したSQL文は以下の通りです。 "SELECT title, avg(rank) as avgrank FROM テーブルB group by title join テーブルA テーブルA .title = テーブルB.title"; 残念ながらエラーなのですが、正しくはどう書くのでしょうか。 単純にユーザーが1人であればそのまま結合できるのですが、同じタイトルのものの評価を平均しないといけないため、頭がおかしくなりそうです。

  • GROUP BYを行った後に結合したい。

    oracle8iを使用しています。 2つのテーブルを結合したいと思っていますが、 テーブル構成が、N対Nのテーブルのため、 片方をグループ化したあとに結合させようと思っています。 ところが、単純にGroup byを使うと、結合した後に グループ化してしまうために、期待した値がひょうじされません。 なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

  • 3つ以上のテーブルを結合して絞り込むには?

    MySQL勉強中のものです。 初歩的な質問ですいませんが、 以下のような3つのテーブルがあります。 テーブルA(店名) A店 B店 C店 D店 テーブルB(販売品目) パソコン ビデオ 冷蔵庫 液晶テレビ デジカメ テーブルC(支払い方法) クレジットカード 銀行振り込み 代引き このデータから、テレビとビデオを販売していて かつクレジットカードに対応しているお店を検索したいと思うのですが、 どうもうまくいきません。 この場合、どのようにSQL文を組み立てればよいのでしょうか。 LEFT JOINで1つに結合すると、カラムごとにレコードが重複して GROUP BYでうまく絞り込めません。 そもそもテーブルの作り方を間違えているのでしょうか。 考え方のヒントだけでも結構ですのでよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 重複データの抽出方法(複数項目)

    以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。 a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 02 |01 |01 |01 03 |02 |01 |03 04 |02 |02 |03 05 |01 |01 |02 06 |02 |02 |03 select * from テスト where c in (select c from テスト group by c,d having count(*)>1) and d in (select d from テスト group by c,d having count(*)>1) そうしたところ、以下の結果になってしまいました。 想定では、○のレコードだけ抽出できると思ったのです。 ×のレコードを抽出したくないのですが、SQLのどこが 間違っているのでしょうか? a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 ○ 02 |01 |01 |01 ○ 03 |02 |01 |03 × 04 |02 |02 |03 ○ 06 |02 |02 |03 ○ (使用DB)SQLServer2000