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でどうにかしたいのですがわかる方いらっしゃいますでしょうか?
助けてください。よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
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 ('柔道','空手')
)
)
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のかたの回答と違って、
日本語と英語とドイツ語ができる人や
柔道と空手と剣道ができる人も対象になります。
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(*) = 検索対象の数;
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- その他(データベース) accessについて 2 2022/05/31 16:58
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- JavaScript html javascriptにてWeb SQLを操作したい。 2 2022/12/16 17:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ギターのコードが分からない
-
マイクラPC版のコマンドで効率...
-
1テーブル&複数レコードの更新...
-
SQL Left Join で重複を排除す...
-
LEFT JOIN と GROUP BY
-
1行目は1、2行目は1~2、...
-
ふたつのテーブルを参照してデ...
-
MySQLのSELECT文の書き方
-
先輩社員(男性)の誕生日プレゼント
-
【MySQL】auto_incrementの値を...
-
このSQL文の意味を教えてくださ...
-
ニコニコをパソコンからTwitter...
-
MySQL 最大値のレコードの特定
-
神戸 三宮でのおいしい夕食は?
-
FMV-B8200に合うメモリを教えて...
-
四捨五入について
-
SODIMM DDR2 PC2-4200 が標準メ...
-
iPad2にアップルのエクセル同...
-
エクセルで最後の文字だけ置き...
-
”photo id” とは何ぞや?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報