質問: 複数テーブルの結合及び評価させることは可能??? 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を使ってみています。構文も変わりますか?)
回答: 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 くらいなので動くんじゃないかな。