アプリ版:「スタンプのみでお礼する」機能のリリースについて

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文について、具体的にはどのようなことをやっているのでしょうか?教えてください。お願いします。

A 回答 (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 供給全体.部品点数=登録ありの供給.部品点数
    • good
    • 0
この回答へのお礼

なんだか難しいですね。ありがとうございます。
よくよくSQLをみてみると、イメージはつかめてきました。ちょっとした芸当ですね。参考にさせていただきます。

お礼日時:2005/09/26 08:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す