CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

高分求一条Sql语句

楼主savagewang1978(遛鎏)2006-06-28 19:28:13 在 MS-SQL Server / 基础类 提问

表A内容如下  
        aaa  
        bbb  
  表B内容如下:  
        aaa   ccc1     2006  
        aaa   ccc2     2005    
        bbb   ddd1     2006  
        bbb   ddd2     2005  
   
  要求结果如下:  
          aaa   ccc1  
          bbb   ddd1  
   
  根据表B的时间倒序出来,取时间最近的一条  
  问题点数:100、回复次数:38Top

1 楼savagewang1978(遛鎏)回复于 2006-06-28 19:28:53 得分 0

数据库不支持Top(补充一下)Top

2 楼azsoft(Try my best)回复于 2006-06-28 19:36:54 得分 0

select   a,   b   from   表B   where   rq=(select   max(rq)   from   表B)   group   by   rqTop

3 楼azsoft(Try my best)回复于 2006-06-28 19:41:42 得分 0

select   o.a,o.b   from   表a   inner   join   (select   a,b   from   表B   where   rq=(select   max(rq)   from   表B)   group   by   a   )   as   o   on   表a.a=o.aTop

4 楼LouisXIV(夜游神)回复于 2006-06-28 19:45:04 得分 0

declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
   
  select   *  
  from   @b   a  
  where   1>(select   count(1)   from   @b   where   a.col1=col1   and   col3>a.col3)  
   
  /*  
   
  col1   col2   col3                  
  ----   ----   -----------    
  aaa     ccc1   2006  
  bbb     ddd1   2006  
  */Top

5 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:03:46 得分 0

a表沒看到作用,借用LouisXIV(夜游神)的數據  
   
  declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
   
  Select   col1,col2   From   @b   B   Where   col3=(Select   Max(col3)   From   @b   Where   col1=B.col1)   Order   By   col1  
  --Result  
  /*  
  col1 col2  
  aaa ccc1  
  bbb ddd1  
  */  
  Top

6 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:06:52 得分 0

azsoft(Try   my   best)   的兩條語句都是錯誤的。Top

7 楼xh308(xiaohu)回复于 2006-06-28 20:07:26 得分 0

设表A   的列名:code  
  表B的列名:code,name,time  
  用下述语句:  
  SELECT   code,   name  
  FROM   表2  
  WHERE   code   in(select   code   from   表1)   and    
  time   in(select   max(time)   from   表2   group   by   code);Top

8 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:10:05 得分 0

樓上的語句是錯誤的。  
   
  假如我去掉一條數據  
    aaa   ccc1     2006  
   
  看看會得到怎樣的結果。Top

9 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:12:21 得分 0

如果要加上a表的話  
   
  declare   @a   table  
  (  
  col1   char(3)  
  )  
  insert   into   @a  
  select   'aaa'   union   all  
  select   'bbb'  
   
  declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
   
  Select   A.col1,B.col2   From   @a   A   Inner   Join   @b   B    
  On   A.col1=B.col1  
  Where   B.col3=(Select   Max(col3)   From   @b   Where   col1=B.col1)    
  Order   By   A.col1  
  --Result  
  /*  
  col1 col2  
  aaa ccc1  
  bbb ddd1  
  */Top

10 楼xh308(xiaohu)回复于 2006-06-28 20:15:39 得分 0

设表A   的列名:code  
  表B   的列名:code,name,time  
  用下述语句:  
  SELECT   code,   name  
  FROM   表B  
  WHERE   code   in(select   code   from   表A)   and    
  time   in(select   max(time)   from   表B   group   by   code)  
  order   by   code;Top

11 楼fcuandy(了此残生.)回复于 2006-06-28 20:17:57 得分 0

我把那段话又发这了:  
   
   
  虽然楼主很有诚意的列出了示例数据.我还是看不出楼主要干什么。  
   
  是取表B第一字段相同的记录中第三字段值最大(虽然我的第六感也非常认为是这样,但严谨的思维告诉我一定要问清楚^^)的记录,还是取第三字段为”2006”的记录?  
   
  上面都写那么多条语句了,我没得写了,无聊,随便发发.  
   
  写法有很多种,但第一字段值相同的第三字段最大值也有几个相同的话,想不通楼主要什么结果.哈哈.  
   
  declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'aaa','ccc3',2006   union   all  
  select   'bbb','ddd2',2005  
   
  aaa你是要选ccc1还是ccc3  
  又不能用TOP,没有标识列,没法区分,你想取ccc3也行,想取ccc1也行,反正无法区分,你随便取一条都可以说它是第一条也可以说它是最后一条啦.哈哈Top

12 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:18:08 得分 0

都說了,你的語句有問題的,不是所有的code   的maxtime都一樣。Top

13 楼fcuandy(了此残生.)回复于 2006-06-28 20:20:05 得分 0

即便用IDENTITY插入临时表,呵呵,虽然能跟具标识列选出是用CCC1还是CCC3,   但在实际应用中说明不了问题.Top

14 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:20:09 得分 0

fcuandy(要学的东西还很多)   ,樓主貼出這樣的需求,應該就有一定的原因的。  
   
  假如相同的col1   ,col3不會重復,就不會有任何問題,不要總是往複雜的方向想。Top

15 楼azsoft(Try my best)回复于 2006-06-28 20:23:35 得分 0

承认错误,没有测试。  
  以下是测试成功  
   
  declare   @a   table  
  (  
  col1   char(3)  
  )  
  insert   into   @a  
  select   'aaa'   union   all  
  select   'bbb'  
   
  declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
   
   
   
  select   o.*      
  from   @a   c  
  inner   join   (select   col1,col2,col3    
                          from   @b   b  
                          where   col3=(select   max(col3)   from   @b   a   where   a.col1=b.col1   group   by   col1))   as   o    
                      on     o.col1=c.col1    
   
   
  --结果  
  aaa ccc1 2006  
  bbb ddd1 2006  
   
   
  Top

16 楼fcuandy(了此残生.)回复于 2006-06-28 20:24:07 得分 0

col1肯定重复,不然何必用MAX   取col3.   至于col3有没有重复值就不清楚啦,这要看楼主了.呵呵.  
  Top

17 楼azsoft(Try my best)回复于 2006-06-28 20:26:19 得分 0

楼主的意思:  
   
  可能是用   a表作为主表外连接b表  
  Top

18 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:28:35 得分 0

fcuandy(要学的东西还很多)   (   )   信誉:100     2006-06-28   20:24:00     得分:   0      
     
     
        col1肯定重复,不然何必用MAX   取col3.   至于col3有没有重复值就不清楚啦,这要看楼主了.呵呵.  
   
  ---------------------------  
  我是說col1和col3的組合不會重復,假如是這樣的,你所說的情況就不存在了。  
   
  不需要所有的問題都考慮的那麼複雜的。  
   
       
     
  Top

19 楼azsoft(Try my best)回复于 2006-06-28 20:29:18 得分 0

fcuandy(要学的东西还很多):   说得不无道理,如果col3也有重复   就要用到IDENTITY   取值了Top

20 楼losedxyz(我真的一无所有)回复于 2006-06-28 20:31:46 得分 0

select   a,   b   from   表B   where   rq=(select   max(rq)   from   表B)   group   by   rq  
  Top

21 楼fcuandy(了此残生.)回复于 2006-06-28 20:31:51 得分 0

这全是让人猜,  
  tbA中的col跟    
  tbB中的col1   group出来的  
  一模一样,还有我上面说的那个猜测(还是取第三字段为”2006”的记录),尽管可能性能很小,但都要想.  
  比如实际上他的tbA中可能是   aaa   bbb   ccc这样的记录呢.  
  这时的要求就是col1以tbB为准  
   
  或者  
  比如实际上他的tbB中还有可能一箱   ccc   cccN   2007的记录呢?  
  这时的要求就是col1以tbA为准  
   
  又或者  
  他表A中col1有   ccc,  
  表B中col1有   ddd  
  这时他要求的是两表col1的交集呢?  
   
  不能说他示例数据有问题,至少数据有冗佘,几条示例数据刚好又...Top

22 楼azsoft(Try my best)回复于 2006-06-28 20:36:57 得分 0

fcuandy(要学的东西还很多)     :有点远了。  
   
  楼主呢?出来澄清一下,哈哈。。。  
   
  Top

23 楼fcuandy(了此残生.)回复于 2006-06-28 20:40:51 得分 0

今晚有点无聊.呵呵,不好意思.Top

24 楼savagewang1978(遛鎏)回复于 2006-06-28 21:46:21 得分 0

楼上的都不错,真是感激不尽,给了我很多启发,谢谢大家了Top

25 楼xiaoxiangqing(肖祥清)回复于 2006-06-29 09:22:27 得分 0

if   exists(select   1   from   sysobjects   where   object_id('A')=id   and   type='u')  
  drop   table   A  
   
  if   exists(select   1   from   sysobjects   where   object_id('B')=id   and   type='u')  
  drop   table   B  
  go  
   
  create   table   A(bh   varchar(20)   not   null)  
  create   table   B(bh   varchar(20)   not   null,content   varchar(20)   not   null,year   int   not   null)  
  go  
   
  insert   A  
  select   'aaa'   union   all  
  select   'bbb'  
   
  insert   B  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
  go  
   
  select   *   from   A  
  /*  
  bh  
  aaa  
  bbb  
  */  
  select   *   from   B  
  /*  
  bh content year  
  aaa ccc1 2006  
  aaa ccc2 2005  
  bbb ddd1 2006  
  bbb ddd2 2005  
  */  
   
  select   a.bh,b.content   from   A   join   B   on   a.bh=b.bh   join   (select   bh,max(year)   year   from   B   group   by   bh)c   on   b.bh=c.bh   and   b.year=c.year   order   by   1  
  /*  
  bh content  
  aaa ccc1  
  bbb ddd1  
  */  
  Top

26 楼ls0611(allan)回复于 2006-06-29 09:40:25 得分 0

借上面楼主的代码:  
   
  declare   @a   table  
  (  
  col1   char(3)  
  )  
  insert   into   @a  
  select   'aaa'   union   all  
  select   'bbb'  
   
  declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
   
  select   a.col1,min(a.col2)   as   col2   from   @b   a    
  where   a.col1   in   (select   col1   from   @a)    
  group   by   a.col1Top

27 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-29 09:52:18 得分 0

ls0611(allan)   ,你的結果是對的,但是你的語句完全不符合樓主的邏輯的。Top

28 楼ls0611(allan)回复于 2006-06-29 10:05:22 得分 0

不好意思,没仔细看。Top

29 楼ls0611(allan)回复于 2006-06-29 10:18:57 得分 0

declare   @a   table  
  (  
  col1   char(3)  
  )  
  insert   into   @a  
  select   'aaa'   union   all  
  select   'bbb'  
   
  declare   @b   table  
  (  
  col1   char(3),  
  col2   char(4),  
  col3   int  
  )  
  insert   into   @b  
  select   'aaa','ccc1',2006   union   all  
  select   'aaa','ccc2',2005   union   all  
  select   'bbb','ddd1',2006   union   all  
  select   'bbb','ddd2',2005  
   
  select   a.col1,a.col2   from   @b   a    
  left   join   (select   col1,max(col1+cast(col3   as   char(6)))   as   tt   from   @b   group   by   col1)b   on      
  a.col1=b.col1    
  where   a.col1   in   (select   col1   from   @a)   and   a.col1+cast(a.col3   as   char(6))=b.tt  
  仅供参考!Top

30 楼wcj86009(不懂就问)回复于 2006-06-29 10:39:46 得分 0

学习Top

31 楼kaka009(卡卡007)回复于 2006-06-29 10:41:07 得分 0

create   table   A  
  (  
        stu   varchar   (3)  
  )  
  go  
   
  create   table   B  
  (  
        stu   varchar   (3),  
        mm   varchar   (4),  
        dd   int   ,  
  )  
  insert   into   A(stu)   values('aaa')  
  insert   into   A(stu)   values('bbb')  
   
  insert   into   B(stu,mm,dd)   values   ('aaa','ccc2',2005)  
  insert   into   B(stu,mm,dd)   values   ('bbb','ddd1',2006)  
  insert   into   B(stu,mm,dd)   values   ('bbb','ddd2',2005)  
  insert   into   B(stu,mm,dd)   values   ('aaa','ccc1',2006)    
   
   
  select   B.stu   ,B.mm     from   B   left   join   A     on   B.stu=A.stu   where   dd=2006   order   by   mm   asc  
  Top

32 楼swallowjiang(swallow)回复于 2006-06-29 11:04:42 得分 0

表A内容如下  
        colum1  
        aaa  
        bbb  
  表B内容如下:  
          colum1     colum2   colum3  
        aaa               ccc1     2006  
        aaa               ccc2     2005    
        bbb               ddd1     2006  
        bbb               ddd2     2005  
   
  要求结果如下:  
          aaa   ccc1  
          bbb   ddd1  
  select   colum1,max(colum3)   into   #tmp1   from   Bgroup   by   colum1  
  select   B.colum1,B.colum2   from   B   where   colum1   in   (   select   colum1   from   A)  
  Top

33 楼swallowjiang(swallow)回复于 2006-06-29 11:06:21 得分 0

樓上的后兩句是我寫的SQLTop

34 楼hurricane74()回复于 2006-06-29 13:46:21 得分 0

晕了,看不明白Top

35 楼ych3000()回复于 2006-06-29 15:02:14 得分 0

create   table   A  
  (  
        stu   varchar   (3)  
  )  
  go  
   
  create   table   B  
  (  
        stu   varchar   (3),  
        mm   varchar   (4),  
        dd   int   ,  
  )  
  insert   into   A(stu)   values('aaa')  
  insert   into   A(stu)   values('bbb')  
   
  insert   into   B(stu,mm,dd)   values   ('aaa','ccc2',2005)  
  insert   into   B(stu,mm,dd)   values   ('bbb','ddd1',2006)  
  insert   into   B(stu,mm,dd)   values   ('bbb','ddd2',2005)  
  insert   into   B(stu,mm,dd)   values   ('aaa','ccc1',2006)    
   
   
  select   *   from   a  
  select   *   from   b  
   
  select   a.stu,b.mm   from   a   left   outer   join   b   on   a.stu   =   b.stu   where   dd=2006   order   by   mm   asc  
  Top

36 楼FollowIT(每天进步一点)回复于 2006-06-29 16:35:52 得分 0

已经测试通过:  
  create   table   #tmp_a(  
  data_field_1 varchar(10)  
  )  
  create   table   #tmp_b(  
  data_field_1 varchar(10),  
  data_field_2 varchar(10),  
  data_field_3 varchar(20)  
  )  
   
  insert   into   #tmp_a   values   ('aaa')  
  insert   into   #tmp_a   values   ('bbb')  
  insert   into   #tmp_b   values   ('aaa','ccc1','2006')  
  insert   into   #tmp_b   values   ('aaa','ccc2','2005')  
  insert   into   #tmp_b   values   ('bbb','ddd1','2006')  
  insert   into   #tmp_b   values   ('bbb','ddd2','2005')  
   
  select   #tmp_a.data_field_1,#tmp_b.data_field_2   from   #tmp_a,#tmp_b  
  where   #tmp_a.data_field_1   =   #tmp_b.data_field_1    
  and   #tmp_b.data_field_3   in   (select   max(t.data_field_3)   from   #tmp_b,#tmp_b   t   where   #tmp_b.data_field_1   =   t.data_field_1)  
  order   by   #tmp_b.data_field_3   desc  
   
  drop   table   #tmp_a  
  drop   table   #tmp_b  
   
  result:  
  aaa                     ccc1  
  bbb                     ddd1Top

37 楼zjdyzwx(十一月猪)回复于 2006-06-29 20:07:12 得分 0

 
  select   a.col1   ,   a.col2    
  from     tab   a    
  where   not   exists   (select   1   from   tab   b   where   a.col1   =   b.col1   and   a.col3   <   b.col3)  
   
  or  
   
  select   a.col1   ,   a.col2    
  from   tab   a    
  where   col3   =   (select   max(col3)   from   tab   b   where   a.col1   =   b.col1)  
  Top

38 楼alps014(聆听)回复于 2006-06-29 21:45:56 得分 0

表A内容如下  
        colum1  
        aaa  
        bbb  
  表B内容如下:  
          colum1     colum2   colum3  
        aaa               ccc1     2006  
        aaa               ccc2     2005    
        bbb               ddd1     2006  
        bbb               ddd2     2005  
   
  要求结果如下:  
          aaa   ccc1  
          bbb   ddd1  
  select   colum1,max(colum3)   into   #tmp1   from   Bgroup   by   colum1  
  select   B.colum1,B.colum2   from   B   where   colum1   in   (   select   colum1   from   A)  
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:savagewang1978

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo