select R1.作者,R1.书名,R2.看者 from R1 left join R2 on R1.书名 = R2.书名
如果是说 查询某本书的所有看者,那在后面直接加个where 条件就可以了如: select R1.作者,R1.书名,R2.看者 from R1 left join R2 on R1.书名 = R2.书名 where R1.作者='XX'
是看了作者xx的所有书,也可以看别人的书,但是xx的所有书一定要看
那又 right join 就可以了
就把 left join 改成 right join 就行了
没有考虑效率问题:create table R1(书名 varchar(20),作者 varchar(20)) GO create table R2(书名 varchar(20),看者 varchar(20)) GOinsert into R1 select 'B1','A1' union all select 'B2','A1' GOinsert into R2 select 'B1','R1' union all select 'B2','R1' union all select 'B1','R2' union all select 'B2','R3' GOselect Book.书名,Book.作者,Reader.看者 from ( select 书名,作者,(select count(1) from R1 a where a.作者 = R1.作者) as 图书数 from R1 where 作者 = 'A1' ) Book inner join ( select max(书名) as 书名,看者,作者,sum(图书数) as 图书数 from ( select distinct R2.书名,R2.看者,R1.作者,1 as 图书数 from R2 left join R1 on R1.书名 = R2.书名 where R1.作者 = 'A1' ) ReadBook group by 看者,作者 ) Reader on Reader.作者 = Book.作者 and Reader.图书数 = Book.图书数drop table R1 GO drop table R2 GO/* 书名 作者 看者 -------------------- -------------------- -------------------- B1 A1 R1 B2 A1 R1(所影响的行数为 2 行) */
select R1.作者,R1.书名,R2.看者 from R1 left join R2 on R1.书名 = R2.书名
select R1.作者,R1.书名,R2.看者 from R1 left join R2 on R1.书名 = R2.书名 where R1.作者='XX'
那又 right join 就可以了
就把 left join 改成 right join 就行了
GO
create table R2(书名 varchar(20),看者 varchar(20))
GOinsert into R1
select 'B1','A1'
union all
select 'B2','A1'
GOinsert into R2
select 'B1','R1'
union all
select 'B2','R1'
union all
select 'B1','R2'
union all
select 'B2','R3'
GOselect Book.书名,Book.作者,Reader.看者
from (
select 书名,作者,(select count(1) from R1 a where a.作者 = R1.作者) as 图书数
from R1
where 作者 = 'A1'
) Book
inner join (
select max(书名) as 书名,看者,作者,sum(图书数) as 图书数
from (
select distinct R2.书名,R2.看者,R1.作者,1 as 图书数
from R2
left join R1 on R1.书名 = R2.书名
where R1.作者 = 'A1'
) ReadBook
group by 看者,作者
) Reader
on Reader.作者 = Book.作者
and Reader.图书数 = Book.图书数drop table R1
GO
drop table R2
GO/*
书名 作者 看者
-------------------- -------------------- --------------------
B1 A1 R1
B2 A1 R1(所影响的行数为 2 行)
*/