SQLの勉強をし始めて間もありませんが、以下のSQLについて教えてください。
実はこの問題は昭晃堂発行の北川博之先生が書いた「データベースシステム」という本に乗っている問題です。以下のようなデータベースがあります。
部門(_部門番号,部門名)
部品(_部品番号,部品名)
業者(_業者番号,業者名,住所,電話番号)
従業員(_従業員番号,従業員名,氏名,住所,年齢)
供給(_部門番号,_部品番号,_業者番号,単価,数量) _がついているのは主キー
この中で、登録されているすべての部品の供給を受けている部門の部門番号を表示するSQLを記せという問題があります。
つまり、部品表の供給テーブルの中の部門番号ごとに、供給テーブルのなかに含まれる部品番号と部品テーブルの部品番号がすべて一致するかを調べるSQLを書かなければならないということです。
まったく歯が立たないので、いろいろと調べた結果、
SELECT DISTINCT 部門番号 FROM 供給 AS 供給1
WHERE NOT EXISTS(
SELECT *
FROM 部品
WHERE NOT EXISTS(
SELECT *
FROM 供給 AS 供給2
WHERE 部品.部品番号=供給2.部品番号
AND 供給1.部門番号=供給2.部門番号
));
が正解であるということでした。
しかし、NOT EXISTSが2回も出てくるばかりか、副問い合わせの連続で頭が混乱してよく理解できません。
このSQL文について、具体的にはどのようなことをやっているのでしょうか?教えてください。お願いします。
No.1ベストアンサー
- 回答日時:
このSQLを考えた人の理屈は・・
(1) 部品のうち、供給に使われていないものを見いだす。
(2) (1)の部品を使っていない供給を”答え”とする。
なんだろうと想像します。
オイラが書くなら、次のような感じで書くと思います。
select 供給全体.部門番号
from
(select 部門番号,count(*) as 部品点数 from 供給 group by 部門番号) as 供給全体,
(select 部門番号,count(*) as 部品点数 from 供給
where exists(select 1 from 部品 where 供給.部品番号=部品.部品番号) group by 部門番号) as 登録ありの供給
where 供給全体.部門番号=登録ありの供給.部門番号 and 供給全体.部品点数=登録ありの供給.部品点数
なんだか難しいですね。ありがとうございます。
よくよくSQLをみてみると、イメージはつかめてきました。ちょっとした芸当ですね。参考にさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- 査定・売却・下取り(車) 廃車手続きに詳しい方、教えてください 2 2022/11/28 09:12
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- ヒーター・こたつ・ホットカーペット お忙しいところよろしくお願いいたします。古いシャープ家具調こたつ(30年位前)の電源コードが無くなり 5 2022/12/04 01:56
- その他(悩み相談・人生相談) スティングレー 部品 1 2023/03/23 00:54
- 電気・ガス・水道 壁掛け給油機の水漏れ補修 4 2022/05/01 13:23
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- 車検・修理・メンテナンス ekスポーツターボのウォーターポンプを社外品で交換しようと思うのですが、ディーラーの見積もりに表示さ 1 2022/05/08 13:38
- ハローワーク・職業安定所 ハローワークで紹介状を発行してもらう際に 4 2023/05/16 06:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessでのレコード存在チェック
-
条件をつけて日付の古い行を抜...
-
【SQL】existsでの商演算
-
アクセスで「空き番」の確認
-
Recordset.FindFirstについて
-
SQL文について
-
Access:抽出して、色をつけたい。
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
select insertで複数テーブルか...
-
カレントレコードが無い事を判...
-
Excelでセルの書式設定を使用し...
-
Date型にNULLをセットしたい V...
-
データセットのレコード更新が...
-
select句副問い合わせ 値の個...
-
SQL文で右から1文字だけ削除す...
-
ADO VBA 実行時エラー3021
-
SELECTの結果で同一行を複数回...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessでのレコード存在チェック
-
最新の日付とその金額をクエリ...
-
access 自動採番 年が変わる...
-
[Access]異なるレコード間の文...
-
【アクセスVBA】テーブルにフィ...
-
vba 直前の操作はキャンセルさ...
-
条件をつけて日付の古い行を抜...
-
Accessで日付が変わると番号が...
-
質問です。 下記のテーブルとデ...
-
Recordset.FindFirstについて
-
Access 文字+年ごとの自動採番
-
アクセスで「空き番」の確認
-
Accessの色番号について
-
access2003で学籍番号から生徒...
-
Access:抽出して、色をつけたい。
-
【Access】選択クエリのグルー...
-
access 自動採番 「10-AA-000...
-
電話番号の局番と住所の検索に...
-
sqlで質問です。 Aテーブルの登...
おすすめ情報