「サプライヤー「S1」から供給された少なくともすべての部品のプロジェクト番号を検索する」に対する 2 つの解決策
1. 質問の設計
データベース SPJ には 4 つのテーブルが含まれています。
サプライヤー テーブル S (コード Sno、名前 Sname、ステータス、都市)
スノ | 離陸します | 状態 | 市 |
---|
パーツリストP(コードPno、名称Pname、色Color、重量Weight)
プノ | 名前 | 色 | 重さ |
---|
プロジェクトプロジェクトテーブル J (コード Jno、名前 Jname、都市)
ジノ | 名前 | 市 |
---|
供給状況テーブルSpj(取引先コードSno、部品コードPno、品目コードJno、数量Qty)
スノ | プノ | ジノ | 数量 |
---|
問題は、少なくともエンジニアリング S1 によって供給されるすべての部品のエンジニアリング番号 JNO が使用されることです。
2. 方法 1: 直接解決
アイデア: 直接解決して、最初に S1 サプライヤーによって供給されるすべての部品のセット P1 を見つけ、次に各プロジェクトで使用される部品のセット Pn を見つけます。P1⊆Pn の場合、プロジェクトは S1 サプライヤーによって供給されるすべての部品を使用することを意味します。 S1サプライヤーです。
(select b.Pno from Spj as b where b.Sno='S1') as d //S1供应商供应的全部零件集合P1
(select c.Pno from Spj as c where c.Jno='某一工程代号') //某一工程使用的零件集合
P1⊆Pn が真か偽かを判断するには、P1 と Pn の差集合、つまり P1-Pn のみが必要です。P1-Pn が空集合 (クエリ結果が存在しない) の場合、P1⊆ を意味します。 Pn.
注: Mysql でselect * from A where * not in B;
AB の差分セットを見つけるために使用できます。
select * from
(select b.Pno from Spj as b where b.Sno='S1') as d
where d.Pno not in
(select c.Pno from Spj as c where c.Jno='某一工程代号')
//若查询返回结果为空,则说明该工程没有使用所有的S1提供的零件。
次に、それを使用してnot exists
特定のプロジェクトが条件を満たしているかどうかを判断し、a.Jno
置換'某一工程代号'
プレースホルダーを使用して J テーブル内の各プロジェクトを横断します。
select Jno from J as a where not exists(
select * from
(select b.Pno from Spj as b where b.Sno='S1') as d
where d.Pno not in
(select c.Pno from Spj as c where c.Jno=a.Jno)
);
3. 方法 2: 間接的な解決策
これについては多くのブログで書かれているので、詳しくは説明しません。