• 締切済み

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

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でどうにかしたいのですがわかる方いらっしゃいますでしょうか? 助けてください。よろしくお願いします。

  • Oracle
  • 回答数5
  • ありがとう数0

みんなの回答

回答No.5

これでどうでしょうか? 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 ('柔道','空手') ) )

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

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

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.3

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のかたの回答と違って、 日本語と英語とドイツ語ができる人や 柔道と空手と剣道ができる人も対象になります。

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

--ちなみに……#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(*) = 検索対象の数;

  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

--なるべく簡単にした……つもり 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;

関連するQ&A

  • SQLの正しい書き方

    データベース初心者です。 (机上で学習中のレベル。) 質問用に例えば以下のテーブルがあるとします。 血液型占い。 HUMAN[ID,名前,血液型ID] BLOOD[血液型ID,血液型,性格] 例えばBLOODには各血液型のデータが既に用意されている。 [1,'A','几帳面'] [2,'B','美人'] [3,'O','めんどくさがり'] [4,'AB','よくわからない'] UIから名前と血液型を入力するとHUMANに ユーザーデータが登録されます。 HUMANテーブルでは血液型ではなくて血液型のIDを入れます。 この時に登録するためのSQLの書き方ですが 例えば、'山田','AB'と入力された場合(ここではIDは1と入れる) 以下のSQLの記述が正しいでしょうか。添削をお願いします。 これでも問題ない事は分かっているのですが これが正しいやり方なのかが分からないので宜しくお願いします。 INSERT INTO HUMAN SELECT 1,'山田',B.血液型ID FROM HUMAN A,HUMAN B WHERE A.血液型ID = B.血液型ID

  • SQLの書き方を教えてください。

    初めまして。sql初心者です。OracleのSQLについて質問があります。 「update Aテーブル set Aテーブル.構成順 = (select Bテーブル.順番 from Bテーブル where Aテーブル.ID = Bテーブル.ID and Aテーブル.種類 = Bテーブル.種類CD)」 こういった内容のSQLって発行できるんでしょうか。 Bテーブル.種類CDの"種類CD"で「コンポーネント"種類CD"を宣言してください」というエラーになります。 書き方が分かりません。。 すいませんが教えていただきたく思います。 よろしくお願いいたします。

  • OracleのSQLでWEB上のセクションIDを取得する方法

    お世話になっております。 現在、複数の方が同時に作業する画面をPL/SQLで作成しています。 この画面は、ワークテーブルを使用して動作しています。 上記の通り、複数の方が同時に作業する可能性があるため、 ワークテーブルにセクションIDのカラムを持たせ、判断させたいと思っています。 SELECT文で、作業者の(WEB上の)セクションIDを取得する方法はありませんか? また、別の方法があるのであれば、参考までに教えていただけないでしょうか? 以上、宜しくお願い致します。 環境: Windows2000 Oracle9i IE6.0 PG言語: PL/SQL

  • SQLの書き方

    はじめまして SQL Serverを使用していますが、下記のSQLの書き方がわかりません。 申し訳けありませんが、わかる方がいらっしゃいましたら、どなたか教えて下さい。 ◆質問 テーブル1とテーブル2の下記のKEYで結合させて、取り出した結果でテーブル3を更新したいです。 テーブル2はデータが複数件一致してしまうため、無条件に先頭の1レコードだけを取り出したいです。 取得できたテーブル2のid_1とid_2とid_3をテーブル3に書き出したいです。 ○KEY テーブル1.test = テーブル2.test and テーブル1.test1 = テーブル2.test1 テーブル1.id_2 = テーブル3.id_1 and テーブル1.id_3 = テーブル3.id_2 ○テーブル1 id_1   id_2   id_3   test   test1 bbb   000001   001   000001  100 bbb   000002   001   000002  100 ○テーブル2 id_1   id_2   id_3   test   test1 aaa    1    99    000001   100 ← このレコードを取り出したい aaa    2    99    000001   100 aaa    3    99    000003   100 aaa    4    99    000004   110 ○テーブル3 id_1   id_2   id_3 000001  001  aaa-1-99   ←id_3にテーブル2で取得できたid1 + id2 + id3を書き出したい 000002  001 夜遅くにすみませんがお願いします。

  • SQL削除条件について

    初歩的な質問で大変恐縮ですが、ご教授願います。 以下の二つのテーブルがある場合、1回のSQLで削除する方法を教えてください。 <Aテーブル> --------------- ID 削除フラグ A 0 B 1 C 0 D 1 E 0 E 0 E 0 F 1 F 0 F 1 G 1 G 1 G 1 <Bテーブル> ID ----- A B E F G <削除後のAテーブル> --------------- ID 削除フラグ A 0 C 0 D 1 E 0 E 0 E 0 F 1 F 0 F 1 ※Aは削除フラグが0のため削除されない。 ※C,DはIDが一致しないため削除されない。 ※E,Fは削除フラグが全て1でないため削除されない。 IDが一致していて、削除フラグが全て「1」である場合、Aテーブルを削除する。 としたいのですが、半日悩んでもうまくいきません。 どうかお願い致します。

  • これを抽出するSQLを教えてください

    どういうSQLを書けばこれが実現出来るのか分からないので教えて下さい。 テーブル名 f_table というテーブルがあります。 このテーブルには、f_id,u_id,day(日付)という三つの列があり、下記のようにデータが入っているとします。 f_id  u_id    day   1    1   2007/3/8 2    2   2008/1/2 3    2   2008/1/10 4    1   2007/2/12 このf_tableから、各u_idで一番日付の新しいf_idを抽出する(この表の場合f_idの1と3が抽出される)にはどういうSQLで出来るのでしょうか? ※実際の表ではu_idに入っている数字の種類は1と2だけではなく、もっと沢山あります。 ご回答よろしくお願いします。

  • SQLで二つのテーブルを統合したい

    お世話になります。 Access2000のSQLで質問させて下さい。 下記のAとBのテーブルがある状態で、二つを統合した Cを生成したいのですが、どのようにSQLを作成したらよいでしょうか? お手数でもうしわけございませんが、SQL文で回答頂ければ助かります。 --テーブルA--- ID 名前 11 やまだ 12 さかもと --テーブルB--- ID 名前 25 きのした 26 つちや --C-- ID 名前 11 やまだ 12 さかもと 25 きのした 26 つちや

  • SQL文でテーブルを作りたいのですが・・・

    テーブルを作りたいのですが、思い描くテーブルが作れず、困っています・・・ 例えばMさんがA→B→C→Dと旅行に行ったとします。 そのとき、行った場所によって日付が登録されるようにしたいと思っています。 このように、別な人もいろいろと旅行し、それぞれの日付があり、どんどんと格納していきます。 最初に ID id 日付 date 場所 point (名前はとりあえず、IDとします) でテーブルを作ろうとしましたが、これだとID一つにつき、日付と場所も一つずつしか入りませんよね? どういったテーブルを作ればいいでしょうか? 思い描くテーブルは下記のような感じです。 ID     日付      場所 -------------- 1  |2010/10/06 |  A   |2010/10/14 |  B   |2010/10/20 |  C   |2010/10/25 |  D -------------------------- 2  |2010/10/23 |  B    |2010/10/24 |  A    |2010/10/25 |  D    |2010/10/27 |  C -------------------------- 3  |2010/10/25 |  D    |2010/10/27 |  C    |2010/11/03 |  B    |2010/11/04 |  A    |2010/11/07 |  D    |2010/11/10 |  C ------------------------- 4  |2010/11/10 | B    |2010/11/15 |  A    |2010/11/16 |  D ・・・・・・・・・・・・・・・ このように一つのIDに対して、日付と場所がランダムの数で格納したいのですが、これって可能でしょうか? テーブルを2つ(以上)作り、外部キーを使ってもかまいません。 また、足りなければ違うIDなどでカバーしてもかまいません。 実際は、このようなテーブルを作り、一人毎の動線を調べるために活用したいと思っています。 Mさん:今日はAに行って、明日はBに行き、明後日はCに行った。すなわち動線は・・・のような感じです。 SQL文でテーブルを作ってください。 補足事項等ありましたらご指摘下さい。追加いたします。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • sqlのJoinでこんなこと出来ますか、

    sqlのJoinでこんなこと出来ますか、 当方初心者につき宜しく御願いします。 テーブルAにはIDがありIDはユニークです。テーブルBにはIDと項目がありIDは複数件存在します。項目には「あ」又は「い」、「う」、「え」、「を」が入っています。idに対して「あ」だけの時もあれば、「い」、と「う」が存在する時もあります。1件または複数件存在します。 条件に「あ」を抽出するようにして、「あ」がないときは存在するがテーブルBには存在するという結果を作りたいのです。 ID=1、あ ID=2、NULL という結果を作りたいのです。テーブルの双方に存在して、かつ「あ」であれば「あ」以外はNULLのレコードを作りたいのです。 説明が悪くて申し訳ありませんが宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • 埋め込みSQLについて

    現在C言語で開発を行っている初級のIT技術者です。 pro*cでは、inner joinやexistsを使うとコンパイルエラーとなってしまいます。 泣く泣く、inを使ってしまいました。例えば以下テーブルがあります。 請求テーブル 識別ID 更新日付 201405 20140922 100177 20140204 258087 20140412 201497 20140711 258055 20140812 履歴テーブル 加入者ID 識別ID(主キー) 2014   201405 5800   587405 2014   258087  8507   874575 以下をパッケージに記載しています。 EXEC SQL SELECT 色々 FROM 請求テーブル WHERE 識別ID IN (SELECT 識別ID FROM 請求テーブル WHERE 加入者ID = 変数) ORDER BY 更新日付 ASC 例えば、変数として2014が来た場合は、履歴テーブルより 2014   201405 2014   258087 が選択されて、請求テーブルの更新日付を見て古い方を取ってくるので 結局258087 20140412が取得されます。この代わりとなる、pro*cで記述できる SQLはどんなのがありますでしょうか?