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
.
通过删除这些列,您可以确保数据库不允许错误地输入数据,从长远来看可以省去很多麻烦.一个非常好的例子是你的模式创建,result
Payal表是regno
14,但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中.请注意我对您自己所做的更改:
int
- > integer
.student
所以我复制了名称(和其他人).results
表格中添加了一个主键.虽然这是一个代理键,即它与数据无关,但表应始终具有主键.您可能想要添加一个唯一约束,student_id, dt
但我更喜欢第8点中列出的选项.exams
,并且exam_id
作为外键使用results
.我没有添加这个,但这是值得考虑的事情.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)
归档时间: |
|
查看次数: |
19884 次 |
最近记录: |