利用sql2005的新特性实现根据子表条件得到的主表键且按其排序取出对应主子表记录的方法...

 

假如有两个关联表,是一对多关系的主子表。如下:

主表

None.gif
None.gif
CREATE   TABLE   [ dbo ] . [ CourseT ] (
None.gif    
[ CourseID ]   [ int ]   IDENTITY ( 1 , 1 NOT   NULL ,
None.gif    
[ CourseName ]   [ nchar ] ( 10 ) COLLATE Chinese_PRC_CI_AS_WS  NULL
None.gif
ON   [ PRIMARY ]
None.gif


字表

None.gif CREATE   TABLE   [ dbo ] . [ Broad ] (
None.gif    
[ BroadID ]   [ int ]   IDENTITY ( 1 , 1 NOT   NULL ,
None.gif    
[ CourseID ]   [ int ]   NULL ,
None.gif    
[ BroadName ]   [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS_WS  NULL
None.gif
ON   [ PRIMARY ]
None.gif

如果数据取自CourseT表,我们想查询Broad表中记录对应的CourseT表中的记录,且按CourseID的降序只取一次,在SQL2005中SQL如下

None.gif with   temp   as  
None.gif(
None.gif
select   distinct  courseid  from  Broad 
None.gif),
None.gif temp2 
as
None.gif(
None.gif    
select  courseid , ROW_NUMBER()  OVER ( ORDER   BY  courseid  desc AS  row_num
None.gif     
from   temp  
None.gif)
None.gif
select  CourseT. *   from   CourseT, temp2  where  courset.courseid = temp2.courseid  order   by  row_num


如果数据取自CourseT和Broad表,我们想查询Broad表中记录对应的CourseT表中的记录,且按CourseID的降序只取一次,我们可以如下写:

None.gif with   temp   as
None.gif(
None.gif  
select  courseid, broadid, row_number()  over ( order   by  courseid  desc , broadid  desc   )  as  rownum  from  broad
None.gif),
None.giftemp2 
as
None.gif(
None.gif
select   temp .courseid,  temp .broadid  from   temp   where  rownum = 1
None.gif
union
None.gif
select   temp .courseid,  temp .broadid  from   temp temp   as  temp0  where   temp .rownum  =  temp0.rownum + 1   and   temp .courseid  <>  temp0.courseid
None.gif)
None.gif
None.gif
select  CourseT. * , broad.broadid, broad.broadname  from   CourseT, broad, temp2
None.gif 
where  courset.courseid = broad.courseid  and  temp2.courseid  =  courset.courseid  and  temp2.broadid  =  broad.broadid  order   by  
None.gifbroad.courseid 
desc  ,broad.broadid  desc

经牛人宪哥帮忙,又想出一个更好的方案如下:
None.gif select  CourseT.CourseID,CourseName,b.BroadID,b.BroadName
None.gif 
from  CourseT,broad b,( select   max (broadid) bid,CourseID  from  broad  group   by  courseid ) t
None.gif  
where
None.gif   CourseT.CourseID
= b.CourseId  and  b.CourseID = t.courseid  and  b.broadid = t.bid
None.gif

转载于:https://www.cnblogs.com/laiwen/archive/2006/12/30/607690.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值