『達人に学ぶ SQL徹底指南書』でSQLの勉強をし始めたばかりです。
P.134のSQL文でHAVING以下が理解できず躓いています。
テーブル名:SupParts
列はsup、partの2列で14行
sup | part
A ボルト
A ナット
A パイプ
B ボルト
B パイプ
C ボルト
C ナット
C パイプ
D ボルト
D パイプ
E ヒューズ
E ナット
E パイプ
F ヒューズ
CREATE TABLE SupParts
(sup CHAR(32) NOT NULL,
part CHAR(32) NOT NULL,
PRIMARY KEY(sup, part));
INSERT INTO SupParts VALUES('A', 'ボルト');
INSERT INTO SupParts VALUES('A', 'ナット');
INSERT INTO SupParts VALUES('A', 'パイプ');
INSERT INTO SupParts VALUES('B', 'ボルト');
INSERT INTO SupParts VALUES('B', 'パイプ');
INSERT INTO SupParts VALUES('C', 'ボルト');
INSERT INTO SupParts VALUES('C', 'ナット');
INSERT INTO SupParts VALUES('C', 'パイプ');
INSERT INTO SupParts VALUES('D', 'ボルト');
INSERT INTO SupParts VALUES('D', 'パイプ');
INSERT INTO SupParts VALUES('E', 'ヒューズ');
INSERT INTO SupParts VALUES('E', 'ナット');
INSERT INTO SupParts VALUES('E', 'パイプ');
INSERT INTO SupParts VALUES('F', 'ヒューズ');
★求めるものは、数も種類も全く同じ部品を取り扱う供給業者のペアです。
★解答
SELECT SP1.sup, SP2.sup
FROM SupParts SP1, SupParts SP2
WHERE SP1.sup < SP2.sup /* 業者の組み合わせを作る /
AND SP1.part = SP2.part / 条件1.同じ種類の部品を扱う /
GROUP BY SP1.sup, SP2.sup
HAVING COUNT() = (SELECT COUNT() / 条件2.同数の部品を扱う /
FROM SupParts SP3
WHERE SP3.sup = SP1.sup)
AND COUNT() = (SELECT COUNT(*)
FROM SupParts SP4
WHERE SP4.sup = SP2.sup);
★疑問点
HAVING句の前まで
SELECT SP1.sup, SP2.sup
FROM SupParts SP1, SupParts SP2
WHERE SP1.sup < SP2.sup /* 業者の組み合わせを作る /
AND SP1.part = SP2.part / 条件1.同じ種類の部品を扱う */
GROUP BY SP1.sup, SP2.sup
で
s1 s2
A B
A C
A D
A E
B C
B D
B E
C D
C E
D E
E F
の11列になることは理解できました。
また最初のSELECT句に count() を加えると
s1 s2 count()
A B 2
A C 3
A D 2
A E 2
B C 2
B D 2
B E 1
C D 2
C E 2
D E 1
E F 1
となるのですが、これは以降のHAVING句を理解する手立てになるのでしょうか?
大変恐縮ですが、ご教授いただけるとありがたいです!
宜しくお願いいたします!!
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/21 10:35
2018/04/21 10:37