有一个新闻系统,某一个类的新闻,要求有一条新闻永远置顶,就是第一个语句的,督办情况表(这个名字不会有重复的),这条新闻。然后查出来的其他的就是按时间倒排序的5条新闻(其中categoryid是新闻分类的ID)。这2条单独执行,都能得到我想要的结果。可是联合查询后,第一条“督办情况表“表在最上面,没问题。可下面的5条不对了,不是最新的5条。SELECT *
FROM bbs
WHERE title like "*督办情况表*"
UNION ALL SELECT TOP 5 *
FROM bbs
WHERE categoryid=7
ORDER BY posttime DESC;是access的库,请问是怎么回事啊?谢谢!

解决方案 »

  1.   

    access数据库没有用过,不会,看你sql语句应该是可以的啊...
      

  2.   

     不是最新的,是取出来的不对。
    SELECT TOP 5 *
    FROM bbs
    WHERE categoryid=7
    ORDER BY posttime DESC; 这个和单独执行这句,取出来的5条记录不一样
      

  3.   

    SELECT top 1 * FROM bbs
    WHERE title like "*督办情况表*"
    UNION ALL SELECT TOP 5 *
    FROM bbs
    WHERE categoryid=7
    ORDER BY posttime DESC;
      

  4.   

    而且like 应该是"%%"
    WHERE title like "%督办情况表%"
      

  5.   

    如果你的数据符合你说的条件的话,语句理论上没什么问题!检查一下你数据库的posttime的数据
      

  6.   

     我用的是access库,在access里就是*通配符
      

  7.   

    SELECT *
    FROM bbs
    WHERE title like "*督办情况表*"
    UNION ALL select * from (SELECT TOP 5 *
    FROM bbs
    WHERE categoryid=7
    ORDER BY posttime DESC ) tt;
      

  8.   

    SELECT top 1 *,1 as istop FROM bbs
    WHERE title like "*督办情况表*" Order by posttime DESC
    UNION ALL SELECT TOP 5 *,0 as istop
    FROM bbs
    WHERE categoryid=7
    ORDER BY posttime DESC;以上是一个视图的话,Select ...... ORder by istop DESC,posttime  DESC
      

  9.   

    我记得top好像要加标识排序的
      

  10.   

    SELECT *
    FROM bbs
    WHERE title like "*督办情况表*"
    UNION ALL select * from (SELECT TOP 5 *
    FROM bbs
    WHERE categoryid=7
    ORDER BY posttime DESC ) tt;给你说这样 就行 
      

  11.   

    select * from 
    (SELECT top 1 *,1 as istop FROM bbs WHERE title like '*督办情况表*' Order by posttime DESC) a
    UNION ALL 
    select * from 
    (SELECT TOP 5 *,0 as istop FROM bbs WHERE categoryid=7 ORDER BY posttime DESC) b
      

  12.   

    原语句的执行是
    先union all以后,最后会对所有数据重新排序
      

  13.   

    是把SELECT TOP 5 *
    FROM bbs
    WHERE categoryid=7
    ORDER BY posttime DESC 保存到tt中  就是一个临时表的名称 可以随便更换 
      

  14.   

    使用了UNION,再使用ORDER BY时,后面这个ORDER BY 如果我没记错的话,是针对于合并后的表排序的使用嵌套查询吧
      

  15.   

    实际上我建议你查询两个数据集到DateSet或两个DataTable里,再重新整合为一个新表可能会好些,毕竟在ADO.NET的对象里做这种事情简单
      

  16.   

      谢谢!我试了,不加tt也是可以的,对吗?我加不加tt,都能得到正确的结果。
      

  17.   

    后面的tt是一个别名,因为你的order by是针对前面所有的记录,所以有问题。9楼的方法order by才是针对后面select的。
      

  18.   

    create table tb 
    (
    [ID] int identity(1,1) primary key,
    [categoryid] int,
    title nvarchar(50),
    posttime datetime
    )
    insert into tb(categoryid,title,posttime)
    select 7,'AAA',GETDATE() union all
    select 7,'BBB',dateadd(D,-2,GETDATE()) union all
    select 7,'CCC',dateadd(D,-1,GETDATE()) union all
    select 7,'DDD',dateadd(D,-1,GETDATE()) union all
    select 7,'EEE',dateadd(MI,-1,GETDATE()) union all
    select 7,'FFF',GETDATE() union all
    select 7,'督办情况表',dateadd(HH,-1,GETDATE())Select top 5 case when CHARINDEX('督办情况表',title,0) > 0 then 1 else 0 end as [redu]
    ,categoryid
    ,title
    ,posttime
    from tb
    order by redu desc,posttime desc--查询结果
    --redu        categoryid  title                                              posttime
    ------------- ----------- -------------------------------------------------- -----------------------
    --1           7           督办情况表                                              2011-09-29 22:45:38.617
    --0           7           FFF                                                2011-09-29 23:45:38.617
    --0           7           EEE                                                2011-09-29 23:44:38.617
    --0           7           AAA                                                2011-09-29 23:40:39.847
    --0           7           AAA                                                2011-09-29 23:39:21.700--(5 行受影响)