質問: sqlのテーブル結合 sqlのselectについて質問です。 テーブルa、b、cから情報を取得し、下記の画面イメージを表示させたいのですが、 どのようにテーブルを結合すればよいか判りません。 どなたかご教示ください・・・。よろしくお願いします。 #テーブルcから組名を取得するような処理は画面表示のロジックで行います。 #テーブルa、bの結合についてのみ、教えていただきたいです。 条件 ・氏名と、所属情報の○×を表示したい ・distinct等、重たい処理は避けたい 画面イメージ |氏名 |赤組|白組|青組| ------------------------------ |山田太郎|○ |× |× | |山田花子|× |○ |○ | テーブルa |個人id|氏名 | -------------------- |000001|山田太郎| |000002|山田花子| テーブルb |個人id|組コード| -------------------- |000001|1110 | |000002|1111 | |000002|1112 | テーブルc |組コード|組名| ------------------ |1110 |赤組| |1111 |白組| |1112 |青組|
回答: 文章を拝見する限り、ご希望の処理をoracleでsql文だけで実行するのは難しいと思います。 ・組の数が不定と思われること 組の数が不定であれば、戻ってくるクエリの列数も不定になります。 おそらくexcelのピボットやaccessのマトリックスクエリのような戻りを期待されているのかなと 思いますが、そのようなsql文を書くことはできません。 ・「distinct等、重たい処理は避けたい」と書かれていること 列数が固定であっても、distinctがダメなら、以下のようなgroup byもダメでしょう。 select a.氏名, case when max(case when b.組コード=1110 then 1 else 0 end)>0 then '○' else '×' end 赤組, case when max(case when b.組コード=1111 then 1 else 0 end)>0 then '○' else '×' end 白組, case when max(case when b.組コード=1112 then 1 else 0 end)>0 then '○' else '×' end 青組 from テーブルa a left outer join テーブルb b on b.個人id=a.個人id group by a.個人id, a.氏名 order by a.個人id #まあ、組コードをベタ切りしている時点でご要望には沿っていないと思いますが。 一般的には、 1)上記クエリをinner joinにして○になるものだけ縦(行)で取得して、「画面」に配置する 2)テーブルcも使って○と×の全バリエーションを縦(行)で取得して、「画面」に配置する 3)「画面」のあるモジュール側で、テーブルcを使ってsql文(上のクエリを組の数だけ伸ばしたもの)を予め組み立ててから実行する となるのではないでしょうか。