CREATE TABLE S (SNO VARCHAR2(10),SNAME VARCHAR2(10));
CREATE TABLE C (CNO VARCHAR2(10),CNAME VARCHAR2(10),CTEACHER VARCHAR2(10));
CREATE TABLE SC (SNO VARCHAR2(10),CNO VARCHAR2(10));INSERT INTO S VALUES('001','stu1');
INSERT INTO S VALUES('002','stu2');
INSERT INTO S VALUES('003','stu3');INSERT INTO C VALUES('11','c1','Sampson');
INSERT INTO C VALUES('22','c2','李明');
INSERT INTO C VALUES('33','c3','李明');INSERT INTO SC VALUES('001','11');
INSERT INTO SC VALUES('002','22');
INSERT INTO SC VALUES('003','33');SELECT DISTINCT T1.SNO,T1.SNAME
  FROM S T1
  LEFT JOIN SC T3
    ON T1.SNO = T3.SNO
  LEFT JOIN C T2
    ON T3.CNO = T2.CNO
 WHERE T2.CTEACHER != '李明';

解决方案 »

  1.   

      楼上的 运行一下  结果不对,
    002','stu2'  有选  李明的课  ,但也出现在结果集里?
     请高手解释
      

  2.   

      难道  这个题不用EXISTS  ,NOT EXISTS  , in , not in  
    真的不行?
      

  3.   

     请见如下正解:
     SELECT DISTINCT S.SNO,S.SNAME
     FROM S,C,SC
     WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND C.CTEACHER<>'李明'
      

  4.   

    其实答案很多。提供一个新思路:minus
    如果李明老师的课只有一门
    select s.sno,c.cno
    from s,c
    where c.cteacher='李明'
    minus 
    select sno,cno不止一门:
    select sno from(
    select sc.sno,c.cno
    from sc,c
    where sc.cno=c.cno(+)
    and c.cteacher(+)='李明'
    )group by sno
    having count(cno)=0
      

  5.   

    minus  数据集相减
    select   sno,sname from s --所有学生
    minus
    select  distinct s.sno,s.sname from s,c,sc where s.sno=sc.sno and sc.cno=c.cno and c.cteacher='李明'--选李明的课的学生
     
      

  6.   

    select s.sname from s,sc,c where s.sno=sc.sno and sc.cno=c.cno and c.cteacher not in('李明')