在oracle 10g中加入三个表

Raz*_*zia 3 sql oracle oracle10g

我有3张桌子,学院,学生和结果

create table college
(
clg_id int,
clg_name varchar2()50,
insert into college values(1,'GIFT');
insert into college values(2,'GITA');
insert into college values(3,'MIT');

create table student
(
clg_id int,
regno int,
sname varchar2(50)
)

insert into student values(1,10,sahar);
insert into student values(2,11,raj);
insert into student values(3,12,Payal);
insert into student values(3,13,Monalisha);
insert into student values(2,14,mary);

create table Result
(
clg_id int,
sname varchar2(50),
clg_name varchar2(50),
regno int,
dt date,
result varchar2(30)
)

insert into Result values(1,'sahar',10,'GIFT',20-02-1990,'A+');
insert into Result values(2,'raj',11,'GITA',21-02-1991,''B+);
insert into Result values(3,'monalisha',13,'MIT',22-09-2005,'A++');
insert into Result values(3,'payal',14,'MIT',22-09-2005,'C');
Run Code Online (Sandbox Code Playgroud)

我想从浏览器中给出一个特定的内容dt,clg_id并显示result学生姓名,大学名称以及regno结果存储的日期.

例如:我将进入clg_id = 3,dt = 22-09-2005然后它应显示:

 clg_name   sname      regno    result      
 MIT       monalisha   13        A++     
 MIT       payal        14       C      
Run Code Online (Sandbox Code Playgroud)

我尝试了很多......我的一个尝试是

SELECT college.clg_name,student.sname,
student.regno result.result  FROM college,student,result
WHERE college.clg_id=student.clg_id=result.date;
Run Code Online (Sandbox Code Playgroud)

但这是错的......请帮忙.

Ben*_*Ben 10

好的,为了做到这一点,你实际上不需要加入3个表.我可以在2上完成如下.请注意我使用了显式而不是隐式连接语法.这已经存在了几十年,应该真正使用.

select r.clg_name, s.sname, r.regno, r.result
  from result r
  join student s
    on r.regno = s.regno
 where r.clg_id = 3
   and r.dt = to_date('22-09-2005','dd-mm-yyyy')
Run Code Online (Sandbox Code Playgroud)

我还创建了一个SQL Fiddle来演示这个.

可以在两个连接中执行此操作,因为您已对数据库进行了部分非规范化并且正在复制信息,这可能导致不一致.在表中result不需要列,sname或者clg_name,如果学生只能在一所大学注册,则不需要clg_id.

通过删除这些列,您可以确保数据库不允许错误地输入数据,从长远来看可以省去很多麻烦.一个非常好的例子是你的模式创建,resultPayal表是regno14,但regno你的student表中是12 !

如果您要正确规范化数据库(并纠正上述错误),您的查询将如下所示.请注意,我已经更改了一些命名约定,因此事情稍微有点混乱.

select c.name, s.name, s.id, r.result
  from colleges c
  join students s
    on c.id = s.college_id
  join results r
    on s.id = r.student_id
 where c.id = 3
   and r.dt =  to_date('22-09-2005','dd-mm-yyyy')
Run Code Online (Sandbox Code Playgroud)

这是该查询的模式,也在SQL Fiddle中.请注意我对您自己所做的更改:

  1. 标准化命名约定.
  2. int- > integer.
  3. 表中有多个学生,student所以我复制了名称(和其他人).
  4. 主要和外键关键限制 - 维护完整性非常重要.结果,必须属于必须属于大学的学生.
  5. 另请注意,您输入的日期不正确.永远不要依赖隐式转换并始终明确地执行.
  6. 删除不必要的列.
  7. 我已经在results表格中添加了一个主键.虽然这是一个代理键,即它与数据无关,但表应始终具有主键.您可能想要添加一个唯一约束,student_id, dt但我更喜欢第8点中列出的选项.
  8. 我本以为你会需要另一张桌子exams,并且exam_id作为外键使用results.我没有添加这个,但这是值得考虑的事情.
  9. 学生姓名已增加到最大.你无法用名字来判断,最好不要过度限制.
create table colleges
(
    id integer,
    name varchar2(50),
    constraint pk_colleges primary key ( id )
  );

create table students
(
    id integer,
    name varchar2(4000), -- Use the maximum. Names are impossible to predict
    college_id integer,
    constraint pk_students primary key ( id ),
    constraint fk_student_college foreign key ( college_id )
       references colleges ( id )
);

create table Results
(
    id integer,
    student_id integer,
    dt date,
    result varchar2(30),
    constraint pk_results primary key ( id ),
    constraint fx_result_student foreign key ( student_id )
       references students ( id )
);
Run Code Online (Sandbox Code Playgroud)

进一步阅读: