CREATE TABLE Course
(
课程名称                  VARCHAR2(20) NOT NULL,
课程编号                  VARCHAR2(5),
学分   NUMBER(2,1),
教师编号                  VARCHAR2(5),
先修课程编号              VARCHAR2(5),
CONSTRAINT PK_Course PRIMARY KEY (课程编号)
);
CREATE TABLE Grade
(
学号                      VARCHAR2 (5),
课程编号                  VARCHAR2 (5),
成绩   NUMBER(3,0),
CONSTRAINT PK_Grade PRIMARY KEY (学号, 课程编号),
CONSTRAINT PK_Grade_TO_Students FOREIGN KEY (学号)
                                REFERENCES Students(学号),
CONSTRAINT PK_Grade_TO_Course FOREIGN KEY (课程编号)
                                REFERENCES Course (课程编号)
);查询每门课的课程名和选课人数:
SQL>create or replace view 课程选课人数(课程编号,选课人数) AS
    select 课程编号,count(*) as 选修人数 from Grade
    group by 课程编号;
SQL>select * from 课程选课人数;课程编号   选课人数
-------- ----------
00001             5
00002             5
00003             5
00004             5
00005             5
00006             5
00007             4
因为题中叫写课程名称和选课人数,如果我写成
SQL>create or replace view 课程选课人数(课程名称,选课人数) AS
    select 课程名称,count(*) as 选修人数 from Course,Grade
    group by 课程名称;
SQL>select * from 课程选课人数;
课程名称               选课人数
-------------------- ----------
程序设计                     34
高数                         34
计算机导论                   34
数据库                       34
体育                         34
英语读写                     34
英语听说                     34结果就变成成这样了,34好像是把所有的人数都求和了,怎么样才能出现课程名称               选课人数
-------------------- ----------
程序设计                     5
高数                         5
计算机导论                   5
数据库                       5
体育                         5
英语读写                     5
英语听说                     4这样的结果呀?

解决方案 »

  1.   

    create or replace view 课程选课人数(课程编号,选课人数) AS
      select c.课程名称,count(g.*) as 选修人数 from Grade g, Course c
      where c.课程编号 = g.课程编号
      group by 课程编号;
      

  2.   


    SQL> create or replace view 课程选课人数(课程编号,选课人数) AS
      2  select c.课程名称,count(g.*) as 选修人数 from Grade g, Course c
      3  where c.课程编号 = g.课程编号
      4  group by 课程编号;
    select c.课程名称,count(g.*) as 选修人数 from Grade g, Course c
                              *
    第 2 行出现错误:
    ORA-01747: 无效的用户.表.列, 表.列, 或列规格
      

  3.   

    CREATE OR REPLACE VIEW 课程选课人数(课程名称,选课人数) AS
      SELECT c.课程名称, COUNT(*) AS 选修人数
        FROM Course c, Grade g
       WHERE c.课程编号 = g.课程编号
       GROUP BY c.课程名称;
      

  4.   

    你没有加where条件的话相当于cource和grade两个表做了一个全连接
    grade表里有34条记录
    而cource表里的每一条记录都会与其中一条对应
    因此每个cource就对应有34条记录了