Student
学号        姓名        性别        年龄        所在系
Sno        Sname        Ssex        Sage        Sdept
95001        李勇        男        20        CS
95002        刘晨        女        19        IS
95003        王敏        女        18        MA
95004        张建        男        19        ISCourse
课程号        课程名        先行课        学分
Cno        Cname        Cpno        Ccredit
1        数据库        5        4
2        数学                2
3        信息系统        1        4
4        操作系统        6        3
5        数据结构        7        4
6        数据处理                2
7        PACAL语言        6        4
SC
学号        课程        成绩
Sno        Cno        Grade
95001        1        92
95001        2        85
95001        3        88
95002        2        90
95002        3        80问题:
select s.sno,s.sname,c.cno,c.cname,sc.grade
/*from s join c join sc on sc.cno=c.cno on sc.sno=s.sno*/
/*from s join sc on s.sno=sc.sno join c on sc.cno=c.cno*/以上2中写法有什么不同?from s join c join sc on s.sno=sc.sno on sc.cno=c.cno为什么这样写就不行呢?出现的错误:列前缀 's' 与查询中所用的表名或别名不匹配。

解决方案 »

  1.   

    能不能具体说说呢?
     第一次看到这种写法: from s join c join sc on sc.cno=c.cno on sc.sno=s.sno
      

  2.   

    from s join c join sc on s.sno=sc.sno on sc.cno=c.cno ?没有这种写法.
    --你不如这么写.
    select s.sno,s.sname,c.cno,c.cname,sc.grade 
    from s , c , sc
    where s.sno = sc.sno and sc.cno = c.cno
      

  3.   

    from s join c join sc on sc.cno=c.cno on s.sno=sc.sno
    或者这样from s join sc join c on sc.cno=c.cno on s.sno=sc.sno 也可以查询出来!
      

  4.   

    这种查询的确有意思
    根据查询计划分析,从语法上来看,第一个连接条件应该是最后两个表的关连字段相关联,再与第一个表的字段相关连,这样语法上才正确
    但从语句执行上来看不一定是按照这种关联条件来先后执行,但强制按这种关联顺序来执行也绝对没错象你把from s join c join sc on s.sno=sc.sno on sc.cno=c.cno 改成from c join s join sc on s.sno=sc.sno on sc.cno=c.cno就没错了
      

  5.   

    测试如下:select s.sno,s.sname,c.cno,c.cname,sc.grade 
    from Student s join  Course c join  SC sc on sc.cno=c.cno on sc.sno=s.sno --符合sc与c先关联,没错,加上OPTION (FORCE ORDER)没错select s.sno,s.sname,c.cno,c.cname,sc.grade 
    from Student s join SC sc on s.sno=sc.sno join Course c on sc.cno=c.cno --平常的普通语法,没错select s.sno,s.sname,c.cno,c.cname,sc.grade 
    from  Course c  JOIN Student s join SC sc on s.sno=sc.sno on sc.cno=c.cno --符合sc与s先关联,没错,加上OPTION (FORCE ORDER)也没错select s.sno,s.sname,c.cno,c.cname,sc.grade 
    from Student s join Course c join SC sc on s.sno=sc.sno on sc.cno=c.cno--第一个连接条件不符合sc与c先关联,出错