-PR-
締切り
済み

OracleのSQLについて 助けてください。

  • すぐに回答を!
  • 質問No.7717254
  • 閲覧数82
  • ありがとう数0
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 0% (0/5)

OracleのSQLについて 助けてください。

(例)
テーブルA 「human」
| ID | 名前 |

テーブルB 「kotoba」
| ID | 名前 |

テーブルC 「kakutougi」
| ID | 名前 |

テーブルD 「kotoba_have」
| human.ID | kotoba.ID |

テーブルE 「kakutougi_have」
| human.ID | kakutougi.ID |


テーブルAには一人一人のIDと名前が入っています。
テーブルBには言語の種類IDと種類名(英語、日本語など)が入っています
テーブルCには格闘技の種類IDと種類名が入っています。
テーブルDとテーブルEはその人がどの言語がしゃべれ、どの格闘技ができるかを示しています。
テーブルD、Eはその人が複数の言語が話せ、複数の格闘技ができる場合複数のhuman.IDが入ります。


ここで日本語と英語が話せ、柔道と空手ができる人を呼び出したい場合はどのようなSQLにすればよいのでしょうか。
プログラムでwhileで回してはできるのですが、データ量が膨大のためSQLでどうにかしたいのですがわかる方いらっしゃいますでしょうか?
助けてください。よろしくお願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全5件)

  • 回答No.5
レベル12

ベストアンサー率 40% (175/429)

これでどうでしょうか? select human.名前 from human where exists ( select 'Y' from kotoba_have where kotoba_have."human.id" = human.id and koto ...続きを読む
これでどうでしょうか?

select human.名前
from human
where exists ( select 'Y'
from kotoba_have
where kotoba_have."human.id" = human.id
and kotoba_have."kotoba.id" in (select id
from kotoba
where koboba.名前 in ('日本語','英語')
)
)
and exists ( select 'Y'
from kakutougi_have
where kakutougi_have."human.id" = human.id
and kakutougi_have."kakutougi.id" in (select id
from kakutougi
where kakutougi.名前 in ('柔道','空手')
)
)
  • 回答No.1
レベル9

ベストアンサー率 76% (55/72)

--なるべく簡単にした……つもり SELECT H1.id, H1.name FROM human H1, ( SELECT human_id, kotoba_id FROM kotoba_have, kotoba WHERE kotoba_id = id AND kotoba.name IN ('日本語', '英語')) M1 WHERE H1.id = M1.h ...続きを読む
--なるべく簡単にした……つもり
SELECT H1.id, H1.name
FROM human H1, (
SELECT human_id, kotoba_id
FROM kotoba_have, kotoba
WHERE kotoba_id = id
AND kotoba.name IN ('日本語', '英語')) M1
WHERE H1.id = M1.human_id
GROUP BY H1.id, H1.name
HAVING COUNT(*) = 2
INTERSECT
SELECT H2.id, H2.name
FROM human H2, (
SELECT human_id, kakutougi_id
FROM kakutougi_have, kakutougi
WHERE kakutougi_id = id
AND kakutougi.name IN ('柔道', '空手')) M2
WHERE H2.id = M2.human_id
GROUP BY H2.id, H2.name
HAVING COUNT(*) = 2;
  • 回答No.2
レベル9

ベストアンサー率 76% (55/72)

--ちなみに……#1の原型は SELECT human_id FROM kotoba_have WHERE kotoba_id IN ( 検索対象IDのリスト ) GROUP BY human_id HAVING COUNT(*) = 検索対象の数 INTERSECT SELECT human_id FROM kakutougi_have WHERE kakutougi_id IN ( 検索対象IDのリス ...続きを読む
--ちなみに……#1の原型は
SELECT human_id
FROM kotoba_have
WHERE kotoba_id IN ( 検索対象IDのリスト )
GROUP BY human_id
HAVING COUNT(*) = 検索対象の数
INTERSECT
SELECT human_id
FROM kakutougi_have
WHERE kakutougi_id IN ( 検索対象IDのリスト )
GROUP BY human_id
HAVING COUNT(*) = 検索対象の数;
  • 回答No.3
レベル12

ベストアンサー率 35% (313/889)

select t0.ID,t0."名前" from human t0, kotoba_have t1, kotoba_have t2, kakutougi_have t3, kakutougi_have t4 where t0."human.ID" =t1."human.ID" and t0."human.ID" =t2.& ...続きを読む
select t0.ID,t0."名前"
from human t0,
kotoba_have t1,
kotoba_have t2,
kakutougi_have t3,
kakutougi_have t4
where t0."human.ID" =t1."human.ID"
and t0."human.ID" =t2."human.ID"
and t0."human.ID" =t3."human.ID"
and t0."human.ID" =t4."human.ID"
and t1."kotoba.ID" = (select ID from kotoba where "名前" ='日本語')
and t2."kotoba.ID" = (select ID from kotoba where "名前" ='英語')
and t3."kakutougi.ID" = (select ID from kakutougi where "名前" ='柔道')
and t4."kakutougi.ID" = (select ID from kakutougi where "名前" ='空手')

でいいと思うけど。
但し、ANo1のかたの回答と違って、
日本語と英語とドイツ語ができる人や
柔道と空手と剣道ができる人も対象になります。
  • 回答No.4
レベル12

ベストアンサー率 35% (313/889)

ANo3です。 訂正です。 「但し、ANo1のかたの回答と違って、」 は間違いでした。 「但し、ANo1のかたの回答と同様、」 がただしいです。
ANo3です。
訂正です。

「但し、ANo1のかたの回答と違って、」
は間違いでした。
「但し、ANo1のかたの回答と同様、」
がただしいです。
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ