SQL言語を練習していると、演習の9番目の質問が非常に物議を醸していることがわかったので、考えを個別に共有しました。コミュニケーションを歓迎します。
(テーブルを作成するためのステートメントは記事の最後にあります)
9.番号「01」の学生と同じコースを学習している他の学生の情報を照会します。
select stu.* ,r.t2_count
from student as stu
,(select distinct
t2.sid as t2_sid
,count(t2.cid) as t2_count
from
(select sc.sid ,sc.cid from sc where sc.sid = 01) t1
inner join
(select sc.sid ,sc.cid from sc ) t2
on t1.cid = t2.cid
group by t2.sid
) as r
where
r.t2_count = (select count(sc.cid) from sc where sc.sid = 05)
and stu.sid = r.t2_sid;
アイデア
まず、scテーブルで自己結合を作成し、01人の学生と同じコースを除外してから、01人の学生のコースの総数と同じものに一致させます。
類推によって学ぶ:
1.「05」の学生とまったく同じコースを学習している他の学生の情報を照会します。
コースフィルターの総数を01から05に変更するだけです
select stu.* ,r.t2_count
from student as stu
,(select distinct
t2.sid as t2_sid
,count(t2.cid) as t2_count
from
(select sc.sid ,sc.cid from sc where sc.sid = 01) t1
inner join
(select sc.sid ,sc.cid from sc ) t2
on t1.cid = t2.cid
group by t2.sid
) as r
where
r.t2_count = (select count(sc.cid) from sc where sc.sid = 05)
and stu.sid = r.t2_sid;
2.コースの総数が01を超える場合は、受講したすべてのコースのIDに対応するように、t1サブテーブルのsc.sid = 01を変更する必要があります。
テーブル作成ステートメントとテーブル構造は次のとおりです。
create table Student (SId varchar(10), Sname varchar(10), Sage datetime, Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-12-20' , '男');
insert into Student values('04' , '李云' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
insert into Student values('09' , '张三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '赵六' , '2013-06-13' , '女');
insert into Student values('13' , '孙七' , '2014-06-01' , '女');
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
テーブルの構造と接続