--1.学生表
Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
--2.课程表 
Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号
--3.教师表 
Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名
--4.成绩表 
SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数
*/
--创建测试数据
create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')
insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')
insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')
insert into Student values('04' , N'李云' , '1990-08-06' , N'男')
insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')
insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')
insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
insert into Course values('01' , N'语文' , '02')
insert into Course values('02' , N'数学' , '01')
insert into Course values('03' , N'英语' , '03')
create table Teacher(T# varchar(10),Tname nvarchar(10))
insert into Teacher values('01' , N'张三')
insert into Teacher values('02' , N'李四')
insert into Teacher values('03' , N'王五')
create table SC(S# varchar(10),C# 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)
go
--求:查询和"01"号的同学学习的课程完全相同的其他同学的信息 的正解

解决方案 »

  1.   

    http://topic.csdn.net/u/20100517/17/b2ab9d5e-73a2-4f54-a7ec-40a5eabd8621.html?89116
      

  2.   

    create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
    insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')
    insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')
    insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')
    insert into Student values('04' , N'李云' , '1990-08-06' , N'男')
    insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
    insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')
    insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')
    insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
    create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
    insert into Course values('01' , N'语文' , '02')
    insert into Course values('02' , N'数学' , '01')
    insert into Course values('03' , N'英语' , '03')
    create table Teacher(T# varchar(10),Tname nvarchar(10))
    insert into Teacher values('01' , N'张三')
    insert into Teacher values('02' , N'李四')
    insert into Teacher values('03' , N'王五')
    create table SC(S# varchar(10),C# 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)
    insert into SC values('07' , '04' , 98)go
    --求:查询和"01"号的同学学习的课程完全相同的其他同学的信息 的正解
    select a.* 
    from student a inner join(
    select s# 
    from sc a 
    where s#<>'01' 
    and not exists(select 1 from sc b where s#=a.s# and c# not in(select c# from sc where s#='01'))
    group by s#
    having count(*)=(select count(*) from sc where s#='01')
    )b on a.s#=b.s#
    /*
    S#         Sname      Sage                    Ssex
    ---------- ---------- ----------------------- ----------
    02         钱电         1990-12-21 00:00:00.000 男
    03         孙风         1990-05-20 00:00:00.000 男
    04         李云         1990-08-06 00:00:00.000 男(3 行受影响)*/
    go
    drop table sc,teacher,Student,course
      

  3.   

    create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
    insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')
    insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')
    insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')
    insert into Student values('04' , N'李云' , '1990-08-06' , N'男')
    insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
    insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')
    insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')
    insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
    create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
    insert into Course values('01' , N'语文' , '02')
    insert into Course values('02' , N'数学' , '01')
    insert into Course values('03' , N'英语' , '03')
    create table Teacher(T# varchar(10),Tname nvarchar(10))
    insert into Teacher values('01' , N'张三')
    insert into Teacher values('02' , N'李四')
    insert into Teacher values('03' , N'王五')
    create table SC(S# varchar(10),C# 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)
    insert into SC values('07' , '04' , 98)go
    --求:查询和"01"号的同学学习的课程完全相同的其他同学的信息 的正解
    select a.* 
    from student a inner join(
    select a.s# 
    from sc a inner join sc b on a.c#=b.c# and a.s#<>'01' and b.s#='01'
    group by a.s#
    having count(*)=(select count(*) from sc where s#='01')
    )b on a.s#=b.s#
    /*
    S#         Sname      Sage                    Ssex
    ---------- ---------- ----------------------- ----------
    02         钱电         1990-12-21 00:00:00.000 男
    03         孙风         1990-05-20 00:00:00.000 男
    04         李云         1990-08-06 00:00:00.000 男(3 行受影响)*/
    go
    drop table sc,teacher,Student,course
      

  4.   


    if object_id('student','U') is not null
       drop table student
    go
    --创建测试数据
    create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
    insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')
    insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')
    insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')
    insert into Student values('04' , N'李云' , '1990-08-06' , N'男')
    insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
    insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')
    insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')
    insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
    go
    if object_id('course','u') is not null
       drop table course
    go
    create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
    insert into Course values('01' , N'语文' , '02')
    insert into Course values('02' , N'数学' , '01')
    insert into Course values('03' , N'英语' , '03')
    go
    if object_id('teacher','u') is not null
       drop table teacher
    go
    create table Teacher(T# varchar(10),Tname nvarchar(10))
    insert into Teacher values('01' , N'张三')
    insert into Teacher values('02' , N'李四')
    insert into Teacher values('03' , N'王五')
    go
    if object_id('sc','U') is not null
       drop table sc
    go
    create table SC(S# varchar(10),C# 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)
    go
    select * from student where S# in(
    select S# from sc where C# in (select C# from SC where S#='01') and S#<>'01' group by S# having count(*)=(select count(*) from SC where S#='01'))
    /*
    S#         Sname      Sage                    Ssex
    ---------- ---------- ----------------------- ----------
    02         钱电         1990-12-21 00:00:00.000 男
    03         孙风         1990-05-20 00:00:00.000 男
    04         李云         1990-08-06 00:00:00.000 男(3 行受影响)
    */
      

  5.   

    select * from Student where S# in
    (select distinct SC.S# from SC where S# <> '01' and SC.C# 
    in (select distinct C# from SC where S# = '01') 
    group by 
    SC.S# 
    having 
    count(1) = (select count(1) from SC where S#='01')) 
      

  6.   


    你没理解我的查询逻辑:
    用 select 语句查询 01 所学过的 c#,
    用子查询查找不存在 a.s# 学的课程不在 01 学的课程中的情况,即 a.s# 学的课程,都在 01 所学的课程号中.
    再找出课程数相同的,就是了.因此用 in.
    你可以用各种数据去检验,包正确.
      

  7.   

    create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
    insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')
    insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')
    insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')
    insert into Student values('04' , N'李云' , '1990-08-06' , N'男')
    insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')
    insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')
    insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')
    insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')
    create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
    insert into Course values('01' , N'语文' , '02')
    insert into Course values('02' , N'数学' , '01')
    insert into Course values('03' , N'英语' , '03')
    insert into Course values('04' , N'历史' , '01')
    create table Teacher(T# varchar(10),Tname nvarchar(10))
    insert into Teacher values('01' , N'张三')
    insert into Teacher values('02' , N'李四')
    insert into Teacher values('03' , N'王五')
    create table SC(S# varchar(10),C# 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)  --'01'三门课,01,02,03insert into SC values('02' , '01' , 70)
    insert into SC values('02' , '02' , 60)
    insert into SC values('02' , '03' , 80)  --'02'三门课,课程号01,02,03 仅他与 01 相同insert into SC values('03' , '01' , 80)
    insert into SC values('03' , '02' , 80)  --'03'只有两门课insert into SC values('04' , '01' , 50)
    insert into SC values('04' , '02' , 30)
    insert into SC values('04' , '04' , 20)  --'04'三门课,但课程号与01不同insert into SC values('05' , '01' , 76)
    insert into SC values('05' , '02' , 87)
    insert into SC values('05' , '03' , 31)
    insert into SC values('05' , '04' , 34)  --'05'四门课
    go
    --求:查询和"01"号的同学学习的课程完全相同的其他同学的信息 的正解select a.* 
    from student a inner join(
    select s# 
    from sc a 
    where s#<>'01' 
    and not exists(select 1 from sc b where s#=a.s# and c# not in(select c# from sc where s#='01'))
    group by s#
    having count(*)=(select count(*) from sc where s#='01')
    )b on a.s#=b.s#
    /*
    S#         Sname      Sage                    Ssex
    ---------- ---------- ----------------------- ----------
    02         钱电         1990-12-21 00:00:00.000 男(1 行受影响)
    */
    goselect a.* 
    from student a inner join(
    select a.s#
    from sc a inner join sc b on a.c#=b.c# and a.s#<>'01' and b.s#='01'
    group by a.s#
    having count(*)=(select count(*) from sc where s#='01') and count(*)=(select count(*) from sc where s#=a.s#)
    )b on a.s#=b.s#
    /*
    S#         Sname      Sage                    Ssex
    ---------- ---------- ----------------------- ----------
    02         钱电         1990-12-21 00:00:00.000 男(1 行受影响)*/
    go