日期:2014-05-18  浏览次数:20662 次

请教关于两表连接的问题,谢谢!
问题描述:
两个表:
一个表名:subject,字段: 科目,授课老师,电话
另一表名:score ,字段: 学号,科目,成绩

subject表中每个科目一条记录,不重复
score表中一个学号可有多条记录,分别记录不同科目的分数.

subject:
科目 老师 电话

语文 张老师 1234567
数学 刘老师 1234568
政治 李老师 123456789

score:
学号 科目 成绩
123 语文 86
123 数学 90
123 英语 78
888 语文 89
888 数学 70



SELECT score.*, subject.* FROM score,subject WHERE 学号='123456' AND subject.科目=score.科目

这些语句返回如下:

学号 a.科目 成绩 b.科目 老师 电话
123 语文 86 语文 张老师 1234567
123 数学 90 数学 刘老师 1234568


这条语句只能返回subject表中有的科目,如果score表中含 英语 科目 在subject表中不存在,那么就不会列出.

如果要把在subject表中不存在的科目也列出(如下:),应如何进行,谢谢各位!

学号 a.科目 成绩 b.科目 老师 电话
123 语文 86 语文 张老师 1234567
123 数学 90 数学 刘老师 1234568
123 英语 78 空 空 空





------解决方案--------------------
换成左连接left join 就可以了
select score.*,subjects.*from score left join subjects on subject.科目=score.科目 where 学号='123'
------解决方案--------------------
SQL code
create table tb_subject(科目 varchar(10),老师 varchar(10),电话 varchar(11))
insert into tb_subject values('语文','张老师','1234567') 
insert into tb_subject values('数学','刘老师','1234568') 
insert into tb_subject values('政治','李老师','123456789')
go
create table tb_score(学号 varchar(10),科目 varchar(10),成绩 int)
insert into tb_score values('123','语文',86) 
insert into tb_score values('123','数学',90) 
insert into tb_score values('123','英语',78) 
insert into tb_score values('888','语文',89) 
insert into tb_score values('888','数学',70)
go

select a.学号 , isnull(a.科目,b.科目) 学号 , a.成绩 , b.老师 , b.电话
from tb_score a left join tb_subject b on a.科目 = b.科目

drop table tb_subject,tb_score

/*
学号         学号         成绩          老师         电话          
---------- ---------- ----------- ---------- ----------- 
123        语文         86          张老师        1234567
123        数学         90          刘老师        1234568
123        英语         78          NULL       NULL
888        语文         89          张老师        1234567
888        数学         70          刘老师        1234568

(所影响的行数为 5 行)
*/

------解决方案--------------------
create table subject
(
subject varchar(8),
teacher varchar(8),
phone varchar(11)
)

create table score
(
sno char(3),
subject varchar(8),
grade int
)
go
insert into subject values('语文', '张老师', '1234567')
insert into subject values('数学', '刘老师', '1234568')
insert into subject values('政治', '李老师', '123456789')
insert into score values('123', '语文', 86)
insert into score values('123', '数学', 90)
insert into score values('123', '英语', 78)
insert into score values('888', '语文', 89)
insert into score values('888', '数学', 70)
go
select sc.*, su.*
from score sc left join subject su on sc.subject = su.subject
where sc.sno = '123'
go
/*以下这种方法不符合ANSI的最新规定,在sql server 2000能用*/
select sc.*, su.*
from score sc, subject su
where sc.sno = '123'
and sc.subject *= su.subject
go