真的无法搞懂的问题?SQL SERVER 的自身连接(50分)

  • 主题发起人 主题发起人 wuzhenzhen
  • 开始时间 开始时间
W

wuzhenzhen

Unregistered / Unconfirmed
GUEST, unregistred user!
select distinct t1.title_id
author=rtrim(au_fname)+' '+rtrim(au_lname)
from authors a,titleauthor t1 inner join titleauthor t2
on t1.title_id=t2.title_id
where t1.au_id<>t2.au_id
and t1.au_id=a.au_id
怎么解释的?小弟愚钝无法弄懂?
 
选出那些书和作者名字:这些书都不是1个人写的,而是2个或者2个以上人合作写的
 
假如有一本书 book1 是只由 wzz 写的
on t1.title_id=t2.title_id 是说一样的书连起来
t1: book1:wzz_id - t2: book1:wzz_id
但是 t1.au_id<>t2.au_id 就是说t1和t2连起来的作者要不同, 所以 这个记录不符合要求,选不到的。
假如有一本书 book2 是只由 wzz 和 pipi 写的
书要一样,作者不同,有2条记录能连起来:
t1 t2
book2:pipi_id - book2:wzz_id
book2:wzz_id - book2:pipi_id
打印出来就是
book2 pipi
book2 wzz
distinct的作用是当作者有3个或者3个以上时,有重复记录,比如有作者 a b c3个人
符合条件的记录有
a-b
a-c
b-a
b-c
c-a
c-b
每个出现有重复,所以用distinct选单一不重复的
实际上作者有x 个人,就会出现 x-1 个相同的记录,所以用distinct将重复的输出去掉
 
上面的语句还可以用其他的方法实现,也更容易理解:
select ......from ...,titleauthor t1
where exists (select * from titleauthor t2 where t1.title_id=t2.title_id and t2.au_id<>t1.au_id)
或者
select ......from ...,titleauthor t1
where (select count(*) from titleauthor t2 where t1.title_id=t2.title_id) > 1
 
接受答案了.
 
后退
顶部