一条语句查询“查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名”

时间:2021-06-07 21:43:18
Student(S#,Sname,Sage,Ssex) 学生表     
Course(C#,Cname,T#) 课程表     
SC(S#,C#,score) 成绩表     
Teacher(T#,Tname) 教师表  


 查询和“1002”号的同学学习的课程“完全相同”的其他同学学号和姓名

8 个解决方案

#1


是不是可以把成绩表中的c#按s#来分组,然后取wm_comcat
再来对比

#2


这个难住我了

#3


好办法,就是不太通用.
引用 1 楼 archwuke1 的回复:
是不是可以把成绩表中的c#按s#来分组,然后取wm_comcat
再来对比

#4


大概类似于
SELECT s#,wm_concat(c#) from (SELECT s#,c# FROM 成绩表 ORDER BY c#) GROUP BY s#;

#5



with as c1002(
select c# from sc where s#=1002
)
select * from student
where not exists(
select * from c1002
where not exists (
select * from sc where s#=student.s# and c#=c1002.c#)
);

#6


SQL> select * from sc;
 
   S#    C# SCORE
----- ----- -----
 1002     1    30
 1002     2    40
 1001     2    50
 1001     1    70
 1003     1    70
 1004     1    66
 1004     3    67
 1004     2    68
 
8 rows selected
 
SQL> 
SQL> with t1 as (select s#,count(*) cnt from sc where s#<>1001 and c# in (select c# from sc where s#=1001) group by s#),
  2  t2 as (select s#,count(*) cnt from sc where s#<>1001 group by s#)
  3  select distinct t1.s#  from t1,t2 where t1.s#=t2.s# and t1.cnt=t2.cnt and t1.cnt=(select count(*) from sc where s#=1001);
 
   S#
-----
 1002
 
SQL> 

感觉还是写的太丑陋,不过结果倒是正确的

#7


还是1楼的想法看着舒服
SQL> with t1 as (select s#,wm_concat(c#) cserial from (select * from sc order by s#,c#)group by s#)
  2  select b.s# from t1 a,t1 b
  3   where a.s#=1002 and b.s#<>1002 and a.cserial=b.cserial;
 
   S#
-----
 1001
 
SQL> 

#8


SELECT S# FROM SC WHERE C# IN(SELECT  C# FROM SC WHERE S#='1002') GROUP BY S# HAVING
COUNT(*)=(SELECT COUNT(*) FROM SC WHERE S#='1002');

#1


是不是可以把成绩表中的c#按s#来分组,然后取wm_comcat
再来对比

#2


这个难住我了

#3


好办法,就是不太通用.
引用 1 楼 archwuke1 的回复:
是不是可以把成绩表中的c#按s#来分组,然后取wm_comcat
再来对比

#4


大概类似于
SELECT s#,wm_concat(c#) from (SELECT s#,c# FROM 成绩表 ORDER BY c#) GROUP BY s#;

#5



with as c1002(
select c# from sc where s#=1002
)
select * from student
where not exists(
select * from c1002
where not exists (
select * from sc where s#=student.s# and c#=c1002.c#)
);

#6


SQL> select * from sc;
 
   S#    C# SCORE
----- ----- -----
 1002     1    30
 1002     2    40
 1001     2    50
 1001     1    70
 1003     1    70
 1004     1    66
 1004     3    67
 1004     2    68
 
8 rows selected
 
SQL> 
SQL> with t1 as (select s#,count(*) cnt from sc where s#<>1001 and c# in (select c# from sc where s#=1001) group by s#),
  2  t2 as (select s#,count(*) cnt from sc where s#<>1001 group by s#)
  3  select distinct t1.s#  from t1,t2 where t1.s#=t2.s# and t1.cnt=t2.cnt and t1.cnt=(select count(*) from sc where s#=1001);
 
   S#
-----
 1002
 
SQL> 

感觉还是写的太丑陋,不过结果倒是正确的

#7


还是1楼的想法看着舒服
SQL> with t1 as (select s#,wm_concat(c#) cserial from (select * from sc order by s#,c#)group by s#)
  2  select b.s# from t1 a,t1 b
  3   where a.s#=1002 and b.s#<>1002 and a.cserial=b.cserial;
 
   S#
-----
 1001
 
SQL> 

#8


SELECT S# FROM SC WHERE C# IN(SELECT  C# FROM SC WHERE S#='1002') GROUP BY S# HAVING
COUNT(*)=(SELECT COUNT(*) FROM SC WHERE S#='1002');